二叉排序树的建立和树中节点的查找删除操作

来源:互联网 发布:java bufferreader 编辑:程序博客网 时间:2024/06/10 01:38

#define EQ(x,m) ( x == m ? 1 : 0)#define LT(x,m) ( x < m ? 1 : 0)typedef int Element;typedef struct tag_Tree{Element data;struct tag_Tree * lchild;struct tag_Tree * rchild;}*BiTree,BiTNode;int SearchBST(BiTree T,Element key,BiTree f,BiTree * p){if(!T){*p = f;return 0;}else if( EQ(key,T->data) ){p = T;return 1;}else if( LT(key,T->data) ){return SearchBST(T->lchild,key,T,p);}else{return SearchBST(T->rchild,key,T,p);}}int  InsertBST(BiTree * T , Element e){BiTree s,p,f;if( !SearchBST(*T,e,0,&p) ){s = (BiTree) malloc( sizeof(BiTNode) );s -> data = e;s -> lchild = s -> rchild = 0;if( ! p )*T = s;else if ( LT(e,p->data)){p -> lchild = s;}else{p -> rchild = s;}return 1;}else return 0;}int DeleteBST(BiTree * T,Element e){if(!(*T)){return 0;}else{if( EQ(e,(*T)->data) ){return DeleteSearch(T);}else if( LT(e,(*T)->data) ){return DeleteBST(&((*T)->lchild),e);}elsereturn DeleteBST(&((*T)->rchild),e);}}int DeleteSearch(BiTree* T){BiTree q,s;if(!(*T))return 0;if( ! (*T)->lchild ){q = *T;(*T) = (*T)->rchild;free(q);}else if( ! (*T)->rchild){q = *T;(*T) = (*T)->lchild;free(q);q=0;}else{q = (*T);s = (*T) -> lchild;while( s ->rchild ){q = s;s = s->rchild;}(*T)->data = s ->data;if ( q != (*T))q->rchild = s ->lchild;else{q ->lchild = s ->lchild;}free(s);}}void showTree(BiTree T){if(!T) return ;printf("%d ", T->data);showTree(T->lchild);showTree(T->rchild); }main(){int a[20]={45,24,53,12,13,15,14,37,90};//"hello world!";int n  = 0;BiTree T = 0;BiTree f = 0;BiTree p = 0;while( n < 9){InsertBST(&T , a[n]);n++;}showTree(T);printf("\n");if(! SearchBST(T,53,0,&p) )printf("error\n");DeleteBST(&T,24);showTree(T);printf("\n");}
原创粉丝点击