題目
給定一棵二叉樹,你需要計算它的直徑長度擂错。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值谒麦。這條路徑可能穿過也可能不穿過根結點。
注意:兩結點之間的路徑長度是以它們之間邊的數目表示篮洁。
示例
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;
}
};