二叉树的宽度指的是具有节点数目最多的那一层的节点个数。 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
思路
用一个结构数组保存树的数据,其下标为父节点
遍历时,用一维数组保存每一层的结点数,层数由函数参数表控制
代码
#include <iostream>
#include <cstring>
using namespace std;
typedef struct BiTNode{
int num;
BiTNode *lchild;
BiTNode *rchild;
}*BiTree, BiTNode;
struct doubleInt{
int left;
int right;
};
int nodeNum = 1;
int n;
void CreateBiTree(BiTree &T, doubleInt data[])
{
if(!T)
return;
int left = data[T->num].left;
int right = data[T->num].right;
if(left){
T->lchild = new BiTNode;
T->lchild->num = left;
T->lchild->lchild = NULL;
T->lchild->rchild = NULL;
}else {
T->lchild = NULL;
T->rchild = NULL;
}
if(right){
T->rchild = new BiTNode;
T->rchild->num = right;
T->rchild->lchild = NULL;
T->rchild->rchild = NULL;
}else {
T->rchild = NULL;
}
CreateBiTree(T->lchild,data);
CreateBiTree(T->rchild,data);
}
void preTraverse(BiTree &T)
{
if(!T)
return;
cout << T->num << " ";
preTraverse(T->lchild);
preTraverse(T->rchild);
}
void CountWide(BiTree &T, int floor, int nodeNum[])
{
if(!T)
return;
nodeNum[floor]++;
CountWide(T->lchild,floor+1,nodeNum);
CountWide(T->rchild,floor+1,nodeNum);
}
int main()
{
BiTree T;
cin >> n;
doubleInt data[n+1];
int nodeNum[n+1];
memset(data,0,sizeof(data));
memset(nodeNum,0,sizeof(nodeNum));
int pos, ord;
for(int i=1; i<n; ++i){
cin >> pos >> ord;
if(data[pos].left == 0)
data[pos].left = ord;
else
data[pos].right = ord;
}
// for(int i=0; i<n; ++i){
// cout << i << " " << data[i].left << " " << data[i].right << '\n';
// }
T = new BiTNode;
T->num = 1;
T->rchild = NULL;
T->lchild = NULL;
CreateBiTree(T,data);
// preTraverse(T);
CountWide(T,1,nodeNum);
int max = 1;
for(int i=1; i<=n; ++i){
if( nodeNum[i] > max){
max = nodeNum[i];
}
}
cout << max;
return 0;
}