一、Problem
給定一個二叉樹,我們在樹的節點上安裝攝像頭。
節點上的每個攝影頭都可以監視其父對象、自身及其直接子對象。
計算監控樹的所有節點所需的最小攝像頭數量。
輸入:[0,0,null,0,null,0,null,null,0]
輸出:2
解釋:需要至少兩個攝像頭來監視樹的所有節點。 上圖顯示了攝像頭放置的有效位置之一。
提示:
給定樹的節點數的範圍是 [1, 1000]。
每個節點的值都是 0。
二、Solution
方法一:後序遍歷
因爲根節點要獲取子節點的狀態才能做出判斷,所以此題必定是後序遍歷,子節點可能的狀態有(我們約定爲):
- 0:子節點未被監控
- 1:子節點安裝了監控
- 2:根節點可被監控
class Solution {
public:
// 0:未被監控;1:此節點安裝了監控;2:該結點可被監控
int c;
int dfs(TreeNode* root) {
if (root == NULL) {
return 2;
}
int l = dfs(root->left), r = dfs(root->right);
if (l == 0 || r == 0) { //子節點之一沒有安裝,那麼根就要安裝
c++;
return 1;
} else if (l == 1 || r == 1) { //子節點之一安裝了監控,那麼根結點可被監控
return 2;
} else { //子節點可被監控,但不確保根結點可被監控
return 0;
}
}
int minCameraCover(TreeNode* root) {
return dfs(root) == 0 ? c+1 : c;
}
};
複雜度分析
- 時間複雜度:,
- 空間複雜度:,