跳至主要内容

1448. Count Good Nodes in Binary Tree

1448. Count Good Nodes in Binary Tree

題意

  • 給定一個二元樹,要找出這棵樹中所有的 good nodes

    • 一個節點如果在從 root 到該節點的路徑上,其值大於或等於該路徑上所有其他節點的值,則該節點為 good

限制

  • The number of nodes in the binary tree is in the range [1, 10^5].

  • Each node's value is between [-10^4, 10^4].

解題思路

  • 要找出 goodNodes,對每個節點來說

    • 答案為左子樹 + 右子樹

    • 如果自己比 parent 的數字都大,就額外 + 1

  • 由以上的想法,可按 postorder 順序來遞迴

    • 通過 DFS 遍歷樹的每一個節點,並且在進入每個節點之前,記錄當前路徑上的最大值

    • 在訪問每個節點時,將當前節點的值與迄今為止的路徑最大值比較。如果當前節點值大於或等於這個最大值,則當前節點是一個好節點

    • 每次遞迴調用都需要更新路徑最大值,並且將左子樹和右子樹的好節點數量相加

Solution

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int dfs(TreeNode* root, int maxNum) {
if (!root) {
return 0;
}

maxNum = max(maxNum, root->val);
int left = dfs(root->left, maxNum);
int right = dfs(root->right, maxNum);
if (root->val >= maxNum) {
return left + right + 1;
}
return left + right;
}
public:
int goodNodes(TreeNode* root) {
if (!root) {
return 0;
}

return dfs(root, INT_MIN);
}
};