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;
}