大致思路:
根据举例子模拟找规律,发现需要去对每个结点求“左子树高度+右子树高度”,如左图=1+1=2是最大的,右图2+2=4是最大的。
这里容易只求根节点的,但如右图这种情况,其实要对每个结点求,取最大值。
实现上,我是定义BTNode结构体(left和right都是指针),然后求高度就是递归来做,同时在函数中更新高度和的最大值。别人题解里是只有int left;int right;,原因是发现样例输入里其实输入的就是结点编号,从而无需结点的val。
AC代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct BTNode
{
int val;
BTNode* left;
BTNode* right;
BTNode(int x):val(x),left(NULL),right(NULL){}
};
int maxx = -1;
int cal_depth(BTNode* root)
{
if(root==NULL)
return -1; //根据题意样例模拟了下,这里要设-1
int l_depth=cal_depth(root->left)+1;
int r_depth=cal_depth(root->right)+1;
int sum = l_depth + r_depth;
maxx = max(maxx, sum);
return max(l_depth,r_depth);
}
queue<BTNode*>q;
queue<BTNode*>store;
int main()
{
int n;
cin>>n;
BTNode* root = new BTNode(0);
q.push(root); //根节点
store.push(root);
while(q.size()!=0)
{
BTNode *p = q.front();
q.pop();
int leftVal,rightVal;
scanf("%d",&leftVal);
scanf("%d",&rightVal);
BTNode* left = new BTNode(leftVal);
BTNode* right = new BTNode(rightVal);
if(leftVal!=-1)
{
p->left=left;
q.push(left);
store.push(left);
}
if(rightVal!=-1)
{
p->right=right;
q.push(right);
store.push(right);
}
}
while(store.size()!=0) //对每个结点
{
BTNode *p=store.front();
store.pop();
cal_depth(p);
}
cout<<maxx<<endl;
return 0;
}
别人的AC代码:
#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;
}