972: 统计利用先序遍历创建的二叉树的宽度

题目描述
利用先序递归遍历算法创建二叉树并计算该二叉树的宽度。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再统计创建完成的二叉树的宽度(是指二叉树每层节点数的最大值)。需要注意输入数据序列中”#“字符和非”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。

输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。

输出
输出该用例对应的二叉树的宽度。

样例输入
A##
ABC####
AB##C##
ABCD###EF##G###
A##B##

样例输出
1
1
2
3
1

#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct node
{
    char data;
    struct node *lchild;
    struct node *rchild;
}BTnode;
int j,number,sum[500]={0};//全局变量
char str[100];//全局变量
BTnode* Create()
{
    BTnode*b;
    char ch=str[j++];
    if(ch=='#')//如果是#好,则置为空节点
    {
        b=NULL;
    }else
    {
        b=(BTnode*)malloc(sizeof(BTnode));
        b->data=ch;
        b->lchild=Create();
        //往左子树创建结点
        b->rchild=Create();
        //往右子树创建结点
    }
    return b;
}
void width(BTnode*b,int k)
{
    if(b==NULL) return ;//空节点返回
    else
    {
        sum[k]++;//该层节点数加一
        width(b->lchild,k+1);
        width(b->rchild,k+1);
    }
}
int main()
{
    while(scanf("%s",str)!=EOF)
    {
        //每重新输入一次,都要创建一颗新的二叉树
        BTnode *root=Create();
        j=0;
        number=0;
        width(root,1);
        for(int i=0;i<500;i++)//找最大宽度
        {
            if(number<sum[i])
            {
                number=sum[i];
            }
        }
        printf("%d",number);
        memset(sum,0,sizeof(sum));
        //sum数组置0,下一次要用全新的数据
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 利用创建叉树的步骤如下: 1. 从列中取出第一个节点作为根节点。 2. 在中列中找到根节点的位置,将中列分成左子树和右子树两部分。 3. 根据左子树和右子树的长度,在列中找到左子树和右子树的节点列。 4. 递归地对左子树和右子树进行步骤1-3,直到列为空。 例如,给定列[1,2,4,5,3,6,7],中列[4,2,5,1,6,3,7],可以按照以下步骤创建叉树: 1. 取出列的第一个节点1作为根节点。 2. 在中列中找到根节点1的位置,将中列分成左子树[4,2,5]和右子树[6,3,7]两部分。 3. 根据左子树和右子树的长度,在列中找到左子树[2,4,5]和右子树[3,6,7]的节点列。 4. 递归地对左子树和右子树进行步骤1-3,直到列为空。 最终创建的二叉树如下所示: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 相应的中结果为[4,2,5,1,6,3,7]。 ### 回答2: 二叉树是一种重要的数据存储结构,而创建叉树的方式有多种。其中之一就是利用进行创建创建叉树的具体步骤如下: 1. 读取列中的第一个元素作为二叉树的根节点。 2. 读取列中的下一个元素,如果该元素不为空,就添加为根节点的左子节点,若为空则忽略该元素。 3. 读取列中的下一个元素,如果该元素不为空,就添加为上一步创建的节点的右子节点,若为空则忽略该元素。 4. 重复步骤2,3,直到读完列。 例如,列为:ABD###CE#G##F##,它创建的二叉树如下图: ``` A / \ B C / \ \ D E F / G ``` 在利用创建叉树的同时,我们可以得到二叉树的中列,具体步骤如下: 1. 如果当前节点为NULL,则返回。 2. 中左子树。 3. 输出当前节点的值。 4. 中右子树。 所以该二叉树的中列为:DBEACGF。 以上就是利用创建叉树,并给出相应的中结果的方法,希望能够对大家有所帮助。 ### 回答3: 利用创建叉树是常用的一种方法。该方法的基本思路是:确定根节点,然后递归创建左子树和右子树。下面是具体步骤: 1.读入第一个节点(根节点),并生成该节点。 2.判断节点是否有左子树,如果有,则读入左子树的值,并生成左子树。 3.如果左子树创建完成,则判断该节点是否有右子树,如果有,则读入右子树的值,并生成右子树。 4.重复2、3步骤,直到整个树构建完成。 下面是一个例子,通过创建叉树,并给出相应的中结果: 列:A B D # # E # # C # F # # 其中“#”表示空节点。 根据上面的步骤,我们可以得到下面的二叉树: A / \ B C / / D F / E 中列:D B E A F C 二叉树的中结果可以通过递归访问节点的方式得到。具体步骤如下: 1.访问当前节点的左子树。 2.访问当前节点。 3.访问当前节点的右子树。 对于上面的二叉树,中的过程如下: 1.访问节点D,它没有左子树和右子树,所以直接输出“D”; 2.访问节点B,它有左子树D,所以递归访问节点D;接着输出“B”; 3.访问节点E,它没有左子树和右子树,所以直接输出“E”; 4.访问节点A,它有左子树B和右子树C,所以递归访问节点B(输出“D”和“B”),然后输出“A”,最后递归访问节点C(输出“F”和“C”); 5.访问节点F,它有左子树E,所以递归访问节点E;接着输出“F”; 6.访问节点C,它没有左子树,但有右子树F,所以递归访问节点F(输出“E”和“F”),最后输出“C”。 因此,该二叉树的中结果为“D B E A F C”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值