zoukankan      html  css  js  c++  java
  • 关于二叉排序树树建立并返回根节点

    今天做了一道题,发现须要返回根节点,不想多想。就上网搜了一下。发现当中提供的办法都是须要使用父节点,事实上并不须要使用父节点。

    仅仅须要使用递归函数返回值就能够

    struct  T{
        int x;
        T *lchild,*rchild;
    };
    T* init(T* &t){//树t的初始状态为t=NULL;e==0说明没有叶子节点
        int e;
        scanf("%d",&e);
        if(e==0)t=NULL;
        else {
            t=new T;
            t->x=e;
            init(t->lchild);
            init(t->rchild);
        }
        return t;
    }
        
    建立二叉排序树

    struct T{
        int x;
        T *lchild,*rchild;
    };
    T* insert(T* &t,int data){
        if(!t){
            t=new T;
            t->x=data;
            t->lchild=t->rchild=NULL;
        }
        else if(t->x>data)insert(t->lchild,data);
        else if(t->x<data)insert(t->rchild,data);
        return t;
    }
    T* init(T* &t){//<span style="font-family: 'Courier New', Courier, monospace; font-size: 14px; white-space: pre-wrap;">1 4 3 2 9 7 18 22 0   0代表输入结束</span>
        int e;
        while(scanf("%d",&e)&&e)
            t=insert(t,e);
        return t;
    }

    这里介绍一下指针,指针的引用。

    函数參数的传递的是传值,指针由于传的是地址。所以形參与实參共同指向一个变量,改动形參的值,变量的值也就得到了改动

    #include <cstdio>
    struct T{
        int x;
        T *lchild,*rchild;
    };
    void init(T* t){
        T *p=new T;
        p->x=2;
        p->rchild=p->lchild=NULL;
        t->lchild=p;
        p=new T;
        p->x=3;
        p->rchild=p->lchild=NULL;
        t->rchild=p;
    }
    void in(T* head){
        if(head){
            in(head->lchild);
            printf("%d ",head->x);
            in(head->rchild);
        }
    }
    int main()
    {
        T p;
        T *head=&p;
        head->x=1;
        head->rchild=head->lchild=NULL;
        init(head);
        in(head);
    }//输出2 1 3
    
    输出说明了改动了head指向的变量也就是变量p的值。
    加引用事实上就是相当于传指针的效果,看以下

    #include <cstdio>
    void fun(int &x,int y,int* z){
        x=4;
        y=5;
        *z=6;
        return;
    }
    int main(){
        int a=1,b=2,c=3;
        printf("%d %d %d
    ",a,b,c);
        fun(a,b,&c);
        printf("%d %d %d
    ",a,b,c);
        return 0;
    }
    /*
    1 2 3
    4 2 6
    
    Process returned 0 (0x0)   execution time : 0.169 s
    Press any key to continue.
    */
    
    改动了第一个和第三个的值,那么就能够理解为引用就是指针的便捷方式。

    #include <cstdio>
    struct T{
        int x;
        T *lchild,*rchild;
    };
    void init(T* &t){
        t=NULL;
    }
    void in(T* head){
        if(head){
            in(head->lchild);
            printf("%d ",head->x);
            in(head->rchild);
        }
    }
    int main()
    {
        T p;
        T *head=&p;
        head->x=1;
        head->rchild=head->lchild=NULL;
        printf("%x
    ",head);
        init(head);
        printf("%x",head);
        //in(head);
    }
    //没引用输出28ff10   28ff10
    //有引用输出28ff14   0
    
    总结例如以下:形參为T &t,改动的是实參的值。形參为T *t,改动的是实參地址所指向的变量的值;形參为T* &t,改动的是实參的值。也就是指针的值。

    所以在数据结构课程中递归建立树中(如第一段代码)假设没有加引用那么在递归函数的第一层中会改动树根的值x,在调用建立子树的时候由于根节点的孩子存储的是^,那么在函数调用的时候仅仅是传入了^,  改动了^所指向的内容,也就当然没用了。

     不用引用动态建树

    #include <cstdio>
    struct T{
        int x;
        T* lchild;
        T* rchild;
    };
    void init(T* t,int e){
        while(t->rchild||t->lchild){
                if(t->x>e&&!t->lchild)break;
                if(t->x<e&&!t->rchild)break;
                if(t->x>e){t=t->lchild;}
                if(t->x<e){t=t->rchild;}
        }
        if(t->x>e){
            t->lchild=new T;
            t->lchild->x=e;
            t->lchild->lchild=t->lchild->rchild=NULL;
        }
        else {
            t->rchild=new T;
            t->rchild->x=e;
            t->rchild->lchild=t->rchild->rchild=NULL;
        }
    }
    void in(T* t){
        if(t){
            in(t->lchild);
            printf("%d ",t->x);
            in(t->rchild);
        }
    }
    int main()
    {
        int e;
        T* t=new T;
        t->lchild=t->rchild=NULL;
        scanf("%d",&e);
        t->x=e;
        while(scanf("%d",&e)&&e)
            init(t,e);
        in(t);
        return 0;
    }
    
    输入以0结尾;










  • 相关阅读:
    【渗透攻防Web篇】SQL注入攻击高级
    【在线渗透】中关村--德宇
    [深入学习Web安全](5)详解MySQL注射
    【安全播报】微信突然变静音要谨慎,多人银行卡内余额被转走
    安全圈玩起了直播,"学霸”带你玩转CTF
    2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院
    对症下药 – 疑难杂症之提权技术
    木马编程-手把手带你进入木马的世界之木马编程
    【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】
    升级后开机就提示“android.process.acore”停止执行 --分析 解决方式
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7398866.html
Copyright © 2011-2022 走看看