【樹】A041_LC_監控二叉樹(後序遍歷)

一、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;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章