/*18924 二叉树的宽度
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
二叉树的宽度指的是具有节点数目最多的那一层的节点个数。
1
/ \
2 3
/
4
答案为2, 第二层节点数最多,为2个节点。
输入格式
共n行。
第一行一个整数n,表示有n个结点,编号为1至n。(1<=n<=50)
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。
输出格式
输出二叉树的直径。
输入样例
5
1 2
1 3
2 4
2 5
输出样例
2
https://blog.csdn.net/u013243986/article/details/51859181?utm_medium=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.wap_blog_relevant_pic&dist_request_id=&depth_1-utm_source=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.wap_blog_relevant_pic
里面有一张图可以辅助理解
*/
#include<stdio.h>
#include<math.h>
int tree[100] = { 0 }; //用来存储树的节点数据
int treeNum[100] = { 0 };//出来存储树的节点是放在哪个序号
void f(int p, int c)
{
if (tree[2 * treeNum[p]] == 0) {
tree[2 * treeNum[p]] = c;//放数据
treeNum[c] = 2 * treeNum[p];//放数据的在树里面的序号
}//左子树没有被占用放左子树
else {
tree[2 * treeNum[p] + 1] = c;
treeNum[c] = 2 * treeNum[p] + 1;
}//放在右子树
}
int main()
{
int n;
scanf("%d", &n);
if (n == 1) {
printf("1");
return 0;
}//只有一个节点
int p, c;
scanf("%d %d", &p, &c);
tree[1] = p;
treeNum[p] = 1;
tree[2] = c;
treeNum[c] = 2;
for (int i = 1; i < n - 1; i++)
{
scanf("%d %d", &p, &c);
f(p, c);
}//录入节点情况
int level = log(n) / log(2) + 1; //树的层数 log n
int num = 0;
int max = 0;
int lLast = 0; //每一层最后的序号
for (int i = 1; i <= level; i++)
{
num = 0;
lLast = 2 * pow(2, i - 1) - 1;//每一层最后的序号
for (int j = pow(2, i - 1); j <= lLast; j++) //j是每一层的起点
{
if (tree[j] != 0) //统计每一层非空节点
num++;
}
if (max < num)
max = num;
}
printf("%d", max);
}