18924 二叉树的宽度

Description

二叉树的宽度指的是具有节点数目最多的那一层的节点个数。
          1
         / \
        2   3
       /     
      4     
答案为2, 第二层节点数最多,为2个节点。

输入格式

共n行。
第一行一个整数n,表示有n个结点,编号为1至n,结点1为树根。(1<=n<=50)
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。x第一次出现时y为左孩子

输出格式

输出二叉树的宽度。

输入样例

5
1 2
1 3
2 4
2 5

输出样例

2

变量含义

全局变量
  • level[55]:这是一个数组,用于记录二叉树每一层的节点数量。数组的下标代表二叉树的层数,level[i] 表示第 i 层的节点数量。初始时,数组的所有元素都被初始化为 0
结构体 struct tree
  • p:表示当前节点的父节点编号。
  • l:表示当前节点的左子节点编号。如果没有左子节点,其值为 0
  • r:表示当前节点的右子节点编号。如果没有右子节点,其值为 0
main 函数中的局部变量
  • tree[100]:这是一个结构体数组,用于存储二叉树的所有节点信息。每个数组元素代表一个节点,通过节点编号作为下标访问。初始时,数组的所有元素都被初始化为 0
  • n:表示二叉树的节点数量。
  • i:用于循环计数,在多个 for 循环中作为迭代变量。
  • x 和 y:在读取输入时,x 表示父节点编号,y 表示子节点编号。
  • ans:用于记录二叉树中节点数量最多的那一层的节点个数,即二叉树的宽度。初始值为 0
  • root:表示二叉树的根节点编号,题目中明确根节点编号为 1
#include<stdio.h>
#include<math.h>

//记录每层节点数量
int level[55]={0};

//定义树节点结构
struct tree
{
    int p;
    int l;
    int r;
};

//构建树的函数
void t(int p,int c,struct tree *tree)
{
    tree[c].p=p;
    if(!tree[p].l)
        tree[p].l=c;
    else
        tree[p].r=c;
}

//递归遍历数,统计每层节点数量
void h(int root,int c,struct tree *tree)
{
    level[c]++;
    if(tree[root].l)
        h(tree[root].l,c+1,tree);
    if(tree[root].r)
        h(tree[root].r,c+1,tree);
}

int main()
{
    struct tree tree[100]={0};;
    int n,i,x,y,ans=0;
    scanf("%d",&n);

    //读取节点关系并构建树
    for(i=1;i<n;i++)
    {
        scanf("%d %d",&x,&y);
        t(x,y,tree);
    }

   //已知根节点为1
    int root=1;
    h(root,1,tree);

    //找出节点数最多的层
    for(i=1;i<=50;i++)
    {
        if(level[i]>ans)
            ans=level[i];
    }
    printf("%d",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值