【树】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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章