1. 程式人生 > 其它 >【LeetCode-968】監控二叉樹

【LeetCode-968】監控二叉樹

問題

給定一個二叉樹,我們在樹的節點上安裝攝像頭。

節點上的每個攝影頭都可以監視其父物件、自身及其直接子物件。

計算監控樹的所有節點所需的最小攝像頭數量。

示例

輸入: [0,0,null,0,0]
輸出: 1
解釋: 如圖所示,一臺攝像頭足以監控所有節點。

解答

class Solution {
public:
    int minCameraCover(TreeNode* root) {
        if (dfs(root) == 2) res++;
        return res;
    }
private:
    int res = 0;
    int dfs(TreeNode* root) { // 0: 監控 1: 被監控 2: 未被監控
        if (!root) return 1;
        int left = dfs(root->left);
        int right = dfs(root->right);
        if (left == 2 || right == 2) { // 存在子節點未被監控
            res++;
            return 0;
        }
        if (!left || !right) return 1; // 當前根節點已被監控
        return 2;
    }
};

重點思路

在遞迴途中,使用三種狀態表示當前根結點:當前節點為監控,當前節點已被監控,當前節點尚未被監控。