
題目解析:給定一棵二元樹,計算每一層節點的數值總和,找出總和最大的是在第幾層(層數從 1 開始算)
解題思路:設一個陣列 v 來記錄每一層的總和。寫一個 DFS 遞迴函數並傳入目前深度,若深度等於陣列大小,代表是首次到達該層,直接把節點值塞入陣列;否則就把節點值加進該層現有的總和中。等整棵樹遍歷完,再跑一次迴圈找出陣列中的最大值,回傳對應的索引加 1 即可
class Solution {
public:
vector<int> v;
int maxLevelSum(TreeNode* root) {
int ans = 0, Max = INT_MIN;
solve(root, 0);
for(int i=0; i<v.size(); i++){
if (v[i] > Max) {
Max = v[i];
ans = i;
}
}
return ans+1;
}
void solve(TreeNode* now, int d) {
if (!now) return ;
else if (d == v.size()) {
v.push_back(now->val);
}else {
v[d] += now->val;
}
solve(now->right, d+1);
solve(now->left, d+1);
}
};

題目解析:給定一棵二元樹和兩個目標節點 p 與 q,找出這兩個節點的「最近共同祖先」
解題思路:利用 DFS 遞迴往下找。如果目前節點是空值,或是剛好等於 p 或 q,就直接回傳該節點。接著分別往左右子樹遞迴搜尋,如果左右兩邊都回傳找到了目標,代表 p 和 q 一左一右,目前的節點就是最近共同祖先;如果只有一邊找到,就把找到的那邊一路往上回傳
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left && right) return root;
return left ? left : right;
}
};

題目解析:想像站在一棵二元樹的右側看過去,從上到下把你肉眼能看見的節點數值記錄下來並回傳
解題思路:同樣設一個陣列 v 裝答案,並利用 DFS 帶入深度遞迴。關鍵在於這份程式碼的遞迴是「先走左邊、再走右邊」。如果深度剛好等於陣列大小就新增數值,否則就直接覆蓋掉該深度的舊數值。因為右子樹永遠比左子樹晚遍歷到,所以每一層最後留下來的數字,必定是該層最右側的節點值
class Solution {
public:
vector<int> v;
vector<int> rightSideView(TreeNode* root) {
solve(0, root);
return v;
}
void solve(int d,TreeNode* now) {
if (!now) return ;
else if (d == v.size()){
v.push_back(now->val);
}else{
v[d] = now->val;
}
solve(d+1, now->left);
solve(d+1, now->right);
}
};