#include #include typedef struct Bitree { int key; struct Bitree *lchild,*rchild; }Bitnode,*Bitree; bool Search(Bitree T,int key,Bitree f,Bitree *p) { if(T==NULL) { *p=f; return false; } else if(key==T->key) { *p=T; return true; } else if(keykey) { Search(T->lchild,key,T,p); } else Search(T->rchild,key,T,p); } void CreateTree(Bitree *T,int n) { int i,index; Bitree p,s; printf("请输入排序二叉树的关键字序列:"); for(i=1;i<=n;i++) { scanf("%d",&index); if(!Search(*T,index,NULL,&p)) { s=(Bitree)malloc(sizeof(Bitnode)); s->key=index; s->lchild=NULL; s->rchild=NULL; if(!p) *T=s; else if(indexkey) p->lchild=s; else p->rchild=s; } } } void VisitBitree(Bitree T) { if(T) { VisitBitree(T->lchild); printf("%d->",T->key); VisitBitree(T->rchild); } } void Delete(Bitree &p) { Bitree q,s; if(!p->rchild) { q=p; p=p->lchild; free(q); } if(!p->lchild) { q=p; p=p->rchild; free(q); } else { q=p; s=p->lchild; while(s->rchild) { q=s; s=s->lchild; } p->key=s->key; if(q!=p) { q->rchild=s->lchild; } else q->lchild=s->lchild; } } bool DeleteB(Bitree *T,int x) { if(!T) return false; else { if(x==T->key) { Delete(T); return true; } else if(xkey) DeleteB(T->lchild,x); else DeleteB(T->rchild,x); } } int main() { int n,x; Bitree T=NULL; printf("请输入排序树序列元素个数:\n"); scanf("%d",&n); CreateTree(&T,n); printf("排序树序列中根访问序列:\n"); VisitBitree(T); printf("\n"); printf("输入你要删除的元素:"); scanf("%d",&x); if(DeleteB(T,x)) { printf("排序树修改后的序列中根访问序列如下:\n"); VisitBitree(T); printf("\n"); } else printf("删除失败!该元素不在序列中\n"); }