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,對每個節點來說
- 答案為左子樹 + 右子樹
- 如果自己比父節點的數字都大,就額外 + 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);
}
};
時間與空間複雜度分析
- 時間複雜度:
此解法透過 DFS 只需走訪每個節點一次,因此時間複雜度為 O(N),其中 N 為樹中的節點數量。 - 空間複雜度:
在最壞情況下,樹若呈現鏈狀,遞迴呼叫深度可達 N,故空間複雜度為 O(N);若是較為平衡的樹,高度約為 O(log N),則空間複雜度約為 O(log N)。
Comments ()