@TO18924 二叉树的宽度C
思路:
在建立的二叉树中增加len来确定层数,定义num数组来存储对应层数结点数
注意事项:
结点数为1时宽度为1;
注意输入为
4
1 2
3 4
2 3
这种无序的情况
(creat函数中注释部分)
#include<iostream>
#include<string>
using namespace std;
int num[50]={0}, max1 = 0;
struct node
{
int len;//确定层数
int parent;
int lch;
int rch;
};
node tree[50]={0};
void creat(int f, int c)
{
tree[c].parent = f;//确定好其父节点
//若没有len()函数以下做法在下列情况不适用
/*
4
1 2
3 4
2 3
*/
//tree[c].len = tree[f].len+1;
//int temp = tree[c].len;
//if (temp > max1)max1 = temp;//更新当前最大层数
//num[temp]++;//该层结点数增加
//cout <<temp<<" " << num[temp] << endl;
if (!tree[f].lch)tree[f].lch = c;
else tree[f].rch = c;
}
void len(int f)//遍历确定层数,同时找出最大的结点数
{
if (!tree[f].lch && !tree[f].rch)return;//为叶子时结束
if (tree[f].lch)//左子树
{
int c = tree[f].lch;
tree[c].len = tree[f].len + 1;//子节点层数为父节点层数加1
int temp = tree[c].len;
num[temp]++;
if (max1 < num[temp])max1 = num[temp];
len(c);
}
if (tree[f].rch)//右子树
{
int c = tree[f].rch;
tree[c].len = tree[f].len + 1;//子节点层数为父节点层数加1
int temp = tree[c].len;
num[temp]++;
if (max1 < num[temp])max1 = num[temp];
len(c);
}
}
int main()
{
num[1] = 1;
tree[1].len = 1;
int n;
cin >> n;
if (n == 1) {//考虑n为1时
cout << "1";return 0;
}
int m = n - 1;
while (m--)
{
int f, c;
cin >> f >> c;
creat(f, c);
}
len(1);
cout << max1;
return 0;
}
新手小白,有问题欢迎大佬指正!