题目
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
注意:两结点之间的路径长度是以它们之间边的数目表示。
题目链接
示例
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
题目分析
这道题理解题意是个难点。实际上求得的结果与结点的值无关,只需要考虑每个结点的高度,而路径长度实际上就是找到一个结点,这个结点的左子树高度与右子树高度之和最大。
理解了题意,这道题就不是很难了。
可以递归求每个结点左右子树的高度:
int deep(tree root){
if (root == NULL) return 0;
int left = deep(root->left);
int right = deep(root->right);
return max(left, right) + 1;
}
在递归过程中,可以使用一个变量res
,随时储存当前最大值,递归结束后直接输出res
即可。
题目解答
class Solution {
public:
int res = 0;
int deep(TreeNode* root){
if (root == NULL) return 0;
int left = deep(root->left);
int right = deep(root->right);
if (left + right > res) res = left + right;
return max(left, right) + 1;
}
int diameterOfBinaryTree(TreeNode* root) {
int temp = deep(root);
return res;
}
};