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


    //二叉排序树
    //从大到小输出>=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;
    }
  • 相关阅读:
    如何在Unity中播放影片
    C# typeof()实例详解
    unity3d用鼠标拖动物体的一段代码
    unity3d中Find的用法
    geometry_msgs/PoseStamped 类型的变量的构造
    c++ ros 计算两点距离
    C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
    C++ 结构体指针的定义
    Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'
    C++中的平方、开方、绝对值怎么计算
  • 原文地址:https://www.cnblogs.com/zzuuoo666/p/12095459.html
Copyright © 2020-2023  润新知