[二叉树算法]二叉排序树算法总结

//二叉排序树
//从大到小输出>=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;
}
posted @ 2019-12-25 10:53  ZzUuOo666  阅读(361)  评论(0编辑  收藏  举报