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);
}
};