class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
ans=0;
maxdep(root);
return ans;
}
private:
int ans;
int maxdep(TreeNode* root){
if(!root) return 0;
int l=maxdep(root->left);
int r=maxdep(root->right);
ans=max(ans,l+r);
return (l>r?l:r)+1;
}
};
int maxDepth(TreeNode* root) {
if (!root) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
这个返回的是节点数:
-
空节点:0
-
单节点:1
-
两层树:2
1
/ \
2 3
/ \
4 5
对于节点 2:
-
左子树高度 = 1(节点4)
-
右子树高度 = 1(节点5)
-
经过节点2的最长路径 = 左高度 + 右高度 = 1 + 1 = 2(边数)
所以代码中的 l + r 实际上加的是节点数 ,但结果恰好等于边数。
ans = max(ans, l + r);
因为:
-
l= 左子树的高度(节点数) -
r= 右子树的高度(节点数) -
经过当前节点的路径 = 左子树节点数 + 右子树节点数 = 边数
return (l > r ? l : r) + 1;
↑ ↑
孩子最大深度 加上当前节点到孩子的边
-
l和r:孩子到他们最深后代的距离(边数) -
+1:当前节点到孩子的 1 条边 -
返回值:当前节点到最深后代的距离(边数)