//二叉排序树
//从大到小输出>=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\n",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;
}