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

来源:互联网 发布:淘宝有卖正品的吗 编辑:程序博客网 时间:2024/06/05 09:14
#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;} 
原创粉丝点击