1448. Count Good Nodes in Binary Tree

1448. Count Good Nodes in Binary Tree
Photo by Markus Spiske / Unsplash

題目連結: 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)。