//二叉排序树 //从大到小输出>=k的关键字 20 void OutPut(BTNode *t,int k){ if(t==null) return; if(t->rchild!=null){ OutPut(t->rchild,k); } if(t->data>=k){ printf("%d ",t->data); } if(t->lchild!=null){ OutPut(t->lchild,k); } } //求指定结点在BST中层次 21 int level(BSTNode *t,int k){ int level=1; BTNode *p=t; while(p!=null && p->data!=k){ if(p->data>k){ p=p->lchild; }else{ p=p->rchild; } level++; } if(p==null) return 0; else return level; } //非递归算法求从根到结点p的路径 void Path(BTNode T,BTNode *p){ BTNode *t=T; InitStack(s); InitStack(q); while(t!=null || !isEmpty(s)){ if(t!=null){ push(s,t); pop(s); t=t->rchild; if(t!=null){ pop(q); } }else{ push(&s,t); push(&q,t); if(t==p) return; t=t->lchild; } } }
//删除BST中的某个结点 //1、p无左右孩子直接删 //2、p有左孩子但无右孩子,让p的左孩子作为某双亲*f的孩子 //3、p有右孩子无左孩子,让p的右孩子作为双亲的孩子 //4、p有左孩子也有右孩子,中序后继去代替 int DeleteBST(BTNode *bt,int k){ BTNode *p=bt,*f,*r,*f1;//f是双亲 f=null; while(p!=null && p->data!=k){//先找 f=p; if(p->data>k) p=p->lchild; else p=p->rchild; } if(p==null) return 0; else if(p->lchild==null){//无左子树 if(f==null) bt=p->rchild;//根节点 else if(f->lchild==p){ f->lchild=p->rchild; }else if(f->rchild==p){ f->rchild=p->rchild; } free(p); } else if(p->rchild==null){//无右子树 if(f==null) bt=p->lchild; else if(f->lchild==p){ f->lchild=p->lchild; }else if(f->rchild=p){ f->rchild=p->lchild; } free(p); } else{//3 左右子树都有 f1=p; r=p->rchild; while(r->lchild!=null){ f1=r; r=r->lchild; } if(f1->lchild==r){ f1->lchild=r->rchild; } if(f1->rchild==r){ f1->rchild=r->rchild; } //r替换p r->lchild=p->lchild; r->rchild=p->rchild; if(f==null) bt=r; else if(f->lchild==p){ f->lchild=r; }else{ f->rchild=r; } free(p); } return 1; }