题目描述 Description
5
2 3
4 5
0 0
0 0
n<16
默认第一个是根节点
以输入的次序为编号
2-N+1行指的是这个节点的左孩子和右孩子
注意:第二题有极端数据!
1
给出一个二叉树,输出它的最大宽度和高度。
第一行一个整数n。
下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。
输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。
5
2 3
4 5
0 0
0 0
0 0
2 3
n<16
默认第一个是根节点
以输入的次序为编号
2-N+1行指的是这个节点的左孩子和右孩子
注意:第二题有极端数据!
1
0 0
代码:
#include <iostream>
#include <cstring>
#define L 0
#define R 1
using namespace std;
const int maxn = 200;
int BTree[maxn][2]; //二维数组,BTree[n][0]和BTree[n][1]分别表示n节点的左右孩子
int W[maxn];<span style="white-space:pre"> </span>//记录节点的度
static int deep;<span style="white-space:pre"> </span>//树的深度
void DFS(int i, int j)
{
if (deep < j)
deep = j;
W[j]++;
if (BTree[i][L])
DFS(BTree[i][L], j+1);
if (BTree[i][R])
DFS(BTree[i][R], j+1);
}
int main()
{
int n;
cin >> n;
memset(BTree, 0, sizeof(BTree));
memset(W, 0, sizeof(W));
for (int i = 1; i <= n; i++)
cin >> BTree[i][L] >> BTree[i][R];
DFS(1,1) ;
int wide = 0;
for (int i = 1; i <= maxn; i++)
if (W[i] > wide)
wide = W[i];
cout << wide << " " << deep;
return 0;
}