问题描述:
二叉树问题。比如节点是ABCDE编号是01234,给出每个左右子树的编号。求最大叶子间距。
样例输入:
输入1(如下左图):
3
1 2
-1 -1
-1 -1
输出1:
2
输入2(如下右图):
6
1 -1
2 3
4 -1
-1 5
-1 -1
-1 -1
输出2:
4
思路:
本题容易进入一个误区:认为最大叶子间距就是左右子树的高度之和。但是注意图二的情况,应该输出4.
因此,本次设置全局变量maxd,在每个节点中寻找最大的间距。
#include <cstdio>
const int maxn = 100;
struct node{
int right, left;
}Node[maxn];
int maxd;
int MaxDistance(int root, int &maxd){
if(root == -1){ //如果遇到空节点,以它为根的子树高度为-1
return -1;
}
int lefth = MaxDistance(Node[root].left, maxd) + 1;
int righth = MaxDistance(Node[root].right, maxd) + 1;
if(maxd < lefth + righth){
maxd = lefth + righth; //不断更新最大间距
}
return lefth > righth ? lefth : righth; //返回的是当前节点为根的子树高度
}
int main(){
int n, left, right;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %d", &left, &right);
Node[i].left = left;
Node[i].right = right;
}
MaxDistance(0, maxd);
printf("%d\n", maxd);
return 0;
}