
題目解析: 給定一棵二元樹,如果從根節點走到某個節點的路徑上,沒有任何節點的數值大於該節點的值,這就被稱為「好節點」,目標是找出整棵樹共有幾個好節點
解題思路: 設一個變數ans來記數量。把根節點跟目前路徑的最大值(起點就是根節點本身的值)丟進DFS函數開始遞迴。每次進函數就先檢查目前節點的值有沒有大於等於傳進來的最大值,有的話ans就加1。接著更新最大值,繼續往左右子節點遞迴找下去,最後回傳ans
class Solution {
public:
int ans = 0;
int goodNodes(TreeNode* root) {
int q = root->val;
DFS(root, q);
return ans;
}
void DFS(TreeNode* now, int q1){
if(now->val >= q1) ans++;
q1 = max(q1, now->val);
if(now->right != nullptr) DFS(now->right, q1);
if(now->left != nullptr) DFS(now->left, q1);
}
};

題目解析: 在二元樹中找出一條最長的「交錯路徑」,也就是每走一步就必須改變前進方向(左右方向交替),回傳這條路徑最長可以連續走多遠
解題思路: 設變數ans記最長步數。寫一個DFS函數,傳入目前的行進方向、現在節點跟累積步數。遇到空節點就跳出,並隨時把ans更新成最大的步數。如果目前方向是設定為1,下一步往左就是斷掉重來(步數變1),往右則是順利交錯(步數加1);方向設定為2則相反。一開始從根節點把左右兩種起步方向都丟進去跑,最後回傳ans
class Solution {
public:
int ans = 0;
int longestZigZag(TreeNode* root) {
DFS(1, root, 0);
DFS(2, root, 0);
return ans;
}
void DFS(int pos, TreeNode* now, int deep){
if (!now) return;
ans = max(ans, deep);
if(pos == 1){
DFS(1, now->left, 1);
DFS(2, now->right, deep+1);
}else{
DFS(1, now->left, deep+1);
DFS(2, now->right, 1);
}
}
};