題目 |
題目傳送門:傳送門(點擊此處)
題解 |
思路
從題目很容易想到,這道題要使用遞歸來做,每個節點要存儲兩個值,分別是 左子樹得深度
和 右子樹得深度
,然後求得每個節點得直徑即可
因爲要遍歷一遍節點,所以時間複雜度肯定是 O(n)
,空間複雜度是 樹的高度
,因爲用棧來做遞歸用,所以應該是 O(Height)
,最差是 O(n)
至於難點就是,都要訪問一個公共變量,所以這個變量抽離出來存儲最大得直徑
code
class Solution {
int ans;
public int diameterOfBinaryTree(TreeNode root) {
ans = 1;
depth(root);
return ans - 1;
}
public int depth(TreeNode node) {
if (node == null) return 0; // 訪問到空節點了,返回0
int L = depth(node.left); // 左兒子爲根的子樹的深度
int R = depth(node.right); // 右兒子爲根的子樹的深度
ans = Math.max(ans, L+R+1); // 計算d_node即L+R+1 並更新ans
return Math.max(L, R) + 1; // 返回該節點爲根的子樹的深度
}
}