典型的树形BP问题,一般想好要跟左右子树拿什么信息,然后自定义结构体,然后就分析取值的问题就好
第一种情况是:如果左右子树的高度和大于左右子树的最大直径,则应该取左右子树的高度和。
第二种情况是:如果左右子树的高度和小于左右子树的最大直径,则取左右子树较大的直径
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型
*/
struct Info{
int maxLength;
int height;
Info(int a_maxLength,int a_height){
maxLength = a_maxLength;
height = a_height;
}
};
Info* process(TreeNode* root){
if(root == nullptr)
return new Info(0,0);
Info* left = process(root->left);
Info* right = process(root->right);
int maxLength;
int height;
height = max(left->height,right->height) + 1;
maxLength = max(left->maxLength,right->maxLength);
maxLength = maxLength >= left->height+right->height+ 1 ? maxLength : left->height+right->height+ 1;
return new Info(maxLength,height);
}
int diameterOfBinaryTree(TreeNode* root) {
// write code here
if(root == nullptr)
return 0;
return process(root)->maxLength - 1;
}
};