关于二叉排序树树建立并返回根节点

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

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

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\n",a,b,c);
    fun(a,b,&c);
    printf("%d %d %d\n",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\n",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结尾;










posted @ 2017-08-20 09:17  clnchanpin  阅读(506)  评论(0编辑  收藏  举报