您的位置:首页 > 理论基础 > 数据结构算法

【数据结构基础】二叉搜索(排序)树的基本操作

2017-05-30 15:20 549 查看
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
int data;
struct TreeNode *lchild,*rchild;
}Tree,*BTree;
void Build_Tree(FILE *pfin,BTree *T){
int num;
fscanf(pfin,"%d",&num);
if(num==-1){
*T=NULL;
} else{
*T=(BTree)malloc(sizeof(Tree));
(*T)->data=num;
Build_Tree(pfin,&(*T)->lchild);
Build_Tree(pfin,&(*T)->rchild);
}
}
void Pre_Traversal(FILE *pfout,BTree T){
if(T!=NULL){
fprintf(pfout,"%d ",T->data);
Pre_Traversal(pfout,T->lchild);
Pre_Traversal(pfout,T->rchild);
}
}
/**------------递归实现 查找 插入 删除------------- **/
BTree Search(BTree T,int x){
if(!T){
return NULL;
}else{
if(x<T->data){
T=Search(T->lchild,x);
}else{
if(x>T->data){
T=Search(T->rchild,x);
}else{
return T;
}
}
}
}
void Insert(BTree *T,int in){
if(!(*T)){
*T=(BTree)malloc(sizeof(Tree));
(*T)->data=in;
(*T)->lchild=(*T)->rchild=NULL;
return;
}
if(in<(*T)->data){
Insert(&(*T)->lchild,in);
}else{
Insert(&(*T)->rchild,in);
}
}
//找二叉搜索树中的最大值
BTree FindMax(BTree T,BTree *M){
if(!T){
return *M;
}else{
*M=T;
T=FindMax(T->rchild,M);
}
}
int Delete(BTree *T,int out){
BTree f,p,q,s;
p=*T;
f=NULL;
while(p && p->data!=out){
f=p;
if(p->data>out){
p=p->lchild;
}else{
p=p->rchild;
}
}
if(p==NULL){
return (0);
}
if(p->lchild==NULL){
if(f==NULL){
*T=p->rchild;
}else{
if(f->lchild==p){
f->lchild=p->rchild;
}else{
f->rchild=p->rchild;
}
}
free(p);
}
else{
q=p;
s=p->lchild;
while(s->rchild){
q=s;
s=s->rchild;
}
if(q==p){
q->lchild=s->lchild;
}else{
q->rchild=s->lchild;
}
p->data=s->data;
free(s);
return (1);
}
}
int main(void){
BTree T,s;
BTree M=NULL;
int x,in,out;//查找,插入,删除的数
FILE *pfin,*pfout;
pfin=fopen("datain.txt","r");
pfout=fopen("dataout.txt","w");
Build_Tree(pfin,&T);
//  M=FindMax(T,&M);
//  printf("%d",M->data);
//  Pre_Traversal(pfout,T);
//  scanf("%d",&x);
//  s=Search(T,x);
//  scanf("%d",&in);
//  Insert(&T,in);
//  Pre_Traversal(pfout,T);
scanf("%d",&out);
Delete(&T,out);
Pre_Traversal(pfout,T);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息