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
思路
求二叉树的宽度,求的其实就是具有最多结点的那一层
首先先设定一个标记函数,记录该层的结点数
接着设定一个结构体,包含双亲和左孩子、右孩子。
struct tree { int p; int l; int r; }tree[100];
然后设定一个函数,将数据存入二叉树,第一个传入的为双亲,接着再传入数据,如果左孩子为空,则赋值给左孩子,否则赋值给右孩子。
void t(int p,int c) { tree[c].p=p; if(!tree[p].l) tree[p].l=c; else tree[p].r=c; }
接着先找到根节点,当其双亲为0时说明已经到了根部了。
for(i=1;i<=n;i++) { if(tree[i].p==0) { root=i; break; } }
接着从上往下搜索,一层一层搜索并记录节点数。如果左孩子存在,则结点数加一,接着往下继续搜索,这个时候标记函数的重要性就显现出来了,当同一层多一个结点时,该层加一,一直到左右结点都为0。
void h(int root,int c) { level[c]++; if(tree[root].l) h(tree[root].l,c+1); if(tree[root].r) h(tree[root].r,c+1); }
最后在level函数中找一个最大值即可。
#include<stdio.h>
#include<math.h>
int level[55];
struct tree
{
int p;
int l;
int r;
}tree[100];
void t(int p,int c)
{
tree[c].p=p;
if(!tree[p].l)
tree[p].l=c;
else
tree[p].r=c;
}
void h(int root,int c)
{
level[c]++;
if(tree[root].l)
h(tree[root].l,c+1);
if(tree[root].r)
h(tree[root].r,c+1);
}
int main()
{
int n,i,x,y,root,ans=0;
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d %d",&x,&y);
t(x,y);
}
for(i=1;i<=n;i++)
{
if(tree[i].p==0)
{
root=i;
break;
}
}
h(root,1);
for(i=1;i<=50;i++)
{
if(level[i]>ans)
ans=level[i];
}
printf("%d",ans);
return 0;
}