首页 > 其他 > 详细

二叉树的建立与遍历(深度和叶子的数目)

时间:2020-05-16 14:03:49      阅读:59      评论:0      收藏:0      [点我收藏+]

 

题目中要求将数的数据先存储到字符串中,

比如https://acm.sdut.edu.cn/onlinejudge3/problems/2136

这个题目中,也要求,数的中序遍历,后序遍历,高度和叶子结点的个数,我写本文的目的并不是要记录这些问题,不过在最后附上相应的函数。

肯定先定义一个字符串。

char str[100];

然后,在写建树的函数(我就是在这里,有问题)

我先把,显示遍历结果的函数写出来

void display_DLR(BT *root)
{
    if(root != NULL)
    {
        cout<<root->data;
        display_DLR(root->l);
        display_DLR(root->r);
    }
    else return ;
}

现在,主要讨论建树的函数的写法

我之前最初想到的是这样的

BT *creat_DLR(char *dlr)
{
    BT *root;
    if(*dlr == ,)
        root = NULL;
    else
    {
        root = new BT;
        root->data = *dlr;
        root->l = creat_DLR(++dlr);
        root->r = creat_DLR(++dlr);
    }
    return root;
}

但是,显示不出想要的结果,通过debug发现

以字符串

12,,3,,

建树的过程为例,

当递归过程回到,

建立 1 的建树过程时,参数

*dlr

的值为,1

但并不是,我期待的3

我理解的是,在1的建树过程中,dlr 的值为1。

后来,我想这样来写,但是还是没有成功,具体如下。

BT *creat_DLR(char *dlr)
{
    BT *root;
    static int i = 0;//因为之前,直接int i = 0; 但是,然后下面的代码和现在一样。我感觉和上面的没有什么差别。

    if(*dlr == ,)
        root = NULL;
    else
    {
        root = new BT;
        root->data = *dlr;
        root->l = creat_DLR(dlr + (++i));
        root->r = creat_DLR(dlr + (++i));
    }
    return root;
}

当然,还是没有显示预期的结果,通过debug发现,

这可能和函数的传值过程有关,每此新进入到一个creat_DLR( )函数之后,*dir变为下一个字符,

然后,在加上静态变量i 的值,显然,几次进入新的函数时,静态变量 i 会,变得比较大,

dlr再加上 i 之后,跳过了一些字符。

最后,只好借助全局变量,来实现这个功能。

代码如下,

#include<bits/stdc++.h>
using namespace std;

typedef struct node
{
    char data;
    struct node *l,*r;
}BT;
char str[1000];// 存储DLR序列。
int i;// 用来记录下标
BT *creat_DLR()
{
    BT *root;
    i++;
    if(str[i-1] == ,)//在一开始,i++,所以在这里减去1。
        root = NULL;
    else
    {
        root = new BT;
        root->data = str[i-1];//在一开始,i++,所以在这里减去1。
        root->l = creat_DLR();
        root->r = creat_DLR();
    }
    //我之前把i++;放在了这个位置,没有运行处结果,debug发现,当str[i] != ‘,‘时,进入到一个函数中,并没有起到i++,的效果。
    //所以,放到了最开始。
    return root;
}
void display_DLR(BT *root)
{
    if(root != NULL)
    {
        cout<<root->data;
        display_DLR(root->l);
        display_DLR(root->r);
    }
    else return ;
}


int main()
{
    while(cin>>str)
    {
        i = 0;
        BT *root = creat_DLR();
        display_DLR(root);
        cout<<endl;
    }


    return 0;
}

我想,知道,不接注全局变量能不能实现。

不过,我发现,这个题好像不用存储到字符中,就能过

代码(AC 文首提到的题目)如下, 

#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
    char data;
    struct node *l,*r;
} BT;
BT *creat_DLR()
{
    BT *root;
    char temp;
    cin>>temp;
    if(temp == ,)
        root = NULL;
    else
    {
        root = new BT;
        root->data = temp;
        root->l = creat_DLR();
        root->r = creat_DLR();
    }
    return root;
}

void display_DLR(BT *root)
{
    if(root == NULL)
        return ;
    else
    {
        cout<<root->data;
        display_DLR(root->l);
        display_DLR(root->r);
    }
}
void display_LDR(BT *root)
{
    if(root == NULL)
        return ;
    else
    {
        display_LDR(root->l);
        cout<<root->data;
        display_LDR(root->r);
    }
}
void display_LRD(BT *root)
{
    if(root == NULL)
        return ;
    else
    {
        display_LRD(root->l);
        display_LRD(root->r);
        cout<<root->data;
    }
}
unsigned int depth_tree(BT *root)
{
    if(root == NULL)
        return 0;
    else
    {
        unsigned int l_depth = depth_tree(root->l);
        unsigned int r_depth = depth_tree(root->r);
        return (l_depth > r_depth ? l_depth  : r_depth) + 1;// 因为根节点也算一层,所以加一。
    }
}
unsigned int leave_tree(BT *root)
{
    if(root == NULL)
        return 0;
    else if(root->l == NULL && root->r == NULL)
        return 1;
    else return leave_tree(root->l) + leave_tree(root->r);
}
int main()
{
    //while(1)
    {

        BT *root = creat_DLR();
        display_LDR(root);
        cout<<endl;
        display_LRD(root);
        cout<<endl;
        cout<<leave_tree(root);
        cout<<endl;
        cout<<depth_tree(root);
    }
    return 0;
}

 

附录:

void display_DLR(BT *root)
{
    if(root != NULL)
    {
        cout<<root->data;
        display_DLR(root->l);
        display_DLR(root->r);
    }
}
void display_LDR(BT *root)
{
    if(root != NULL)
    {
        display_LDR(root->l);
        cout<<root->data;
        display_LDR(root->r);
    }
}
void display_LRD(BT *root)
{
    if(root != NULL)
    {
        display_LRD(root->l);
        display_LRD(root->r);
        cout<<root->data;
    }
}
void display_level(BT *root)
{
    BT *que[1000];//最多的个数;
    int out = 0, in = 0;
    if(root != NULL)
    {
        que[in++] = root;
        while(out < in )
        {
            if(que[out]->l != NULL)
                que[in++] = que[out]->l;
            if(que[out]->r != NULL)
                que[in++] = que[out]->r;
            out++;
        }
        cout<<"out: "<<out<<"in "<<in<<endl;
        for(int i = 0; i < in; i++)
            cout<<que[i]->data;
        cout<<endl;
    }
    else return;
}

int depth(BT *root)
{
    if( root == NULL)
        return 0;
    int left = depth(root->l);
    int right = depth(root->r);
    return left > right ? left + 1 : right + 1;
}

 

二叉树的建立与遍历(深度和叶子的数目)

原文:https://www.cnblogs.com/zhang-zsq/p/12896791.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!