求的是直径,这个直径的描述还是有点不好明白的:任意两个结点路径长度中的最大值。
需要注意:直径不一定会过根节点,所以每个节点都有可能是直径的“支点”,计算的时候就需要不停的更新。
class Solution {
public:
int res = 0;
int diameterOfBinaryTree(TreeNode* root) {
if(!root) return 0;
dfs(root);
return res;
}
int dfs(TreeNode* root){
if(!root) return 0;//为空
if(!root->left && !root->right) return 1;//加上这一行会快很多
int l = dfs(root->left);
int r = dfs(root->right);
//左右子树相对根节点的路径和即为以根节点为支点的直径
res = max(res, l+r);
return 1 + max(l, r);
}
};