968.监控二叉树

	// 贪心算法:自底向上,每三层一个摄像机,就能使得所用的摄像机最少。
	// 对最后一个根节点做特判ans++
	private int ans = 0;

	public int minCameraCover(TreeNode root) {

		if (root == null) {
			return 0;
		}
		if (dfs(root) == 2) {
			ans++;
		}
		return ans;

	}

	// 1---该节点没设置摄像,但被监控。
	// 2---该节点没设置摄像,且没被监控。
	// 3---该节点设置了摄像机。
	public int dfs(TreeNode root) {

		if (root == null) {
			return 1;
		}
		int left = dfs(root.left), right = dfs(root.right);

		// left,right=2优先级比3高,碰到2和3可以设置摄像机。
		if (left == 2 || right == 2) {
			ans++;
			return 3; // 表示该节点设置了摄像机
		} else if (left == 3 || right == 3) {
			return 1;
		} else { // 表示该节点需要被设置摄像机
			return 2;
		}
	}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页