标签:
#include<cstdio> #include<cstdlib> #include<cstring> typedef struct BiTNode{ int 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){ *p = T; return 1; }else if(key < T->data) return SearchBST(T->lchild,key,T,p); else return SearchBST(T->rchild,key,T,p); } //插入 int InsertBST(BiTree *T,int key){ BiTree p,s; if(!SearchBST(*T,key,NULL,&p)){ //查找不成功 s = (BiTree)malloc(sizeof(BiTNode)); s->data = key; s->lchild = s->rchild = NULL; if(!p){ //根结点为空,(树不存在) *T = s; //s为根结点 }else if(key < p->data){ p->lchild = s; } else{ p->rchild = s; } return 1; }else{ return 0; } } //删除 int Delete(BiTree *p){ BiTree q,s; if((*p)->rchild == NULL){ q = *p;*p = (*p)->lchild;free(q); }else if((*p)->lchild == NULL){ q = *p;*p = (*p)->rchild;free(q); }else{ q = *p;s = (*p)->lchild; while(s->rchild) { //找到左子树最最右面的结点,也就是小于且最接近该结点的结点(中序前驱结点) q = s; s = s->rchild; //q 为前驱结点的父结点 } (*p)->data = s->data; //将 s 为根结点的树上接 就可以了 if(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((*T)->data == key){ return Delete(T); }else if(key <(*T)->data){ return DeleteBST(&(*T)->lchild,key); }else{ return DeleteBST(&(*T)->rchild,key); } } } int main(){ int i; int key; int switch1; int a[10] = {62,88,58,47,35,73,51,99,37,93}; BiTree T = NULL; for(i=0;i<10;i++) InsertBST(&T,a[i]); while(true){ printf("输入1:查找,输入2:删除\n"); scanf("%d",&switch1); if(switch1 == 1){ BiTree p = NULL; scanf("%d",&key); if(SearchBST(T,key,NULL,&p)){ printf("%d 查找成功!\n",p->data); }else{ printf("查找失败!\n"); } }else if(switch1 == 2){ scanf("%d",&key); if(DeleteBST(&T,key)){ printf("删除成功!\n"); }else{ printf("不存在此结点!\n"); } }else{ printf("重新输入!\n"); continue; } } return 0; }
标签:
原文地址:http://www.cnblogs.com/zhuozhuo/p/5425489.html