二叉排序树,建立,查找,删除等操作

来源:互联网 发布:复杂网络特性 编辑:程序博客网 时间:2024/06/03 06:27
/*输入互不相同的一组整数,构造一棵二叉排序树,要求:① 按递减有序的顺序输出;② 输入一个整数,查找该整数是否在该二叉排序树中,查找成功返回1,否则返回0;③ 在②中,若查找成功,则将该结点从二叉排序树中删除。*/ #include<stdio.h>#include<stdlib.h>typedef struct{int key;}ElemType;typedef struct BiTNode{ElemType data;struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;int SearchBST(BiTree T,int key,BiTree f,BiTree &p){if(!T){p=f;return 0;}else if(key==T->data.key){p=T;return 1;}else if(key<T->data.key){return SearchBST(T->lchild,key,T,p);}else return SearchBST(T->rchild,key,T,p);}int InsertBST(BiTree &T,ElemType e){BiTree s,p;if(!SearchBST(T,e.key,NULL,p)){  //查找不成功s=(BiTree)malloc(sizeof(BiTNode));s->data=e;s->lchild=s->rchild=NULL;if(!p) T=s;else if(e.key<p->data.key)  p->lchild=s;else p->rchild=s;return 1;}else return 0;}void CreateBiTree(BiTree &T){    ElemType x;    scanf("%d",&x.key);    while(x.key){        InsertBST(T,x);//在二叉排序树中插入新结点s        scanf("%d",&x.key);    }}void visit(ElemType data){printf("%3d",data.key);}void Traverse(BiTree T){//递减有序输出 if(T){Traverse(T->rchild);visit(T->data);Traverse(T->lchild);} } int Delete(BiTree &p){BiTree q,s;if(!p->rchild){//只需接左子树q=p; p=p->lchild;free(q); }else if(!p->lchild){//只需接右子树q=p;  p=p->rchild;free(q); }else{//左右子树均不空q=p;  s=p->lchild;while(s->rchild){q=s; s=s->rchild; //找到右下角 }p->data=s->data; //把右下角s的值赋给pif(q!=p) q->rchild=s->lchild;else q->lchild=s->lchild; free(s);}return 1;}int DeleteBST(BiTree &T,int key){if(!T)  return 0;else{if(key==T->data.key){return Delete(T);}else if(key<T->data.key)return DeleteBST(T->lchild,key);elsereturn DeleteBST(T->rchild,key);}}int main(){int n;BiTree T=NULL;printf("输入一组数:");CreateBiTree(T);printf("递减有序输出:");Traverse(T);printf("\n");printf("输入要删除的数:");scanf("%d",&n); DeleteBST(T,n);Traverse(T);return 0;}

阅读全文
0 0