典型的树形BP问题,一般想好要跟左右子树拿什么信息,然后自定义结构体,然后就分析取值的问题就好
第一种情况是:如果左右子树的高度和大于左右子树的最大直径,则应该取左右子树的高度和。
alt
第二种情况是:如果左右子树的高度和小于左右子树的最大直径,则取左右子树较大的直径 alt

/**
 * 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;
    }
};