1 题目
https://leetcode-cn.com/problems/binary-tree-cameras/
2 题意
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
图见原题
例如:
输入:[0,0,null,0,0]
输出:1
3 思路
author's blog == http://www.cnblogs.com/toulanboy/
大体框架:根据左孩子和右孩子的情况,决定父亲是否要装监控。
具体策略为:从底向上扫描节点,根据孩子的状态进行决定当前节点的状态。
(1)左右孩子其中有1个没被覆盖,那么父节点装监控。
(2)左右孩子若都被覆盖,那么父节点是没有被覆盖(先不装监控,结合该节点的父亲的情况处理)
(3)左右孩子有1个或以上装了监控(另外一个是已覆盖状态),那么当前节点都是已被覆盖。
用以下数字表示节点的状态
0 - 该节点没有被覆盖
1 - 该节点上装有监控
2 - 该节点已被覆盖
4 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//author's blog == http://www.cnblogs.com/toulanboy/
class Solution {
public:
int ans = 0;
/*
大体框架:根据左孩子和右孩子的情况,决定父亲是否要装监控。
具体策略为:从底向上扫描节点。
(1)左右孩子其中有1个没被覆盖,那么父节点装监控。
(2)左右孩子若都被覆盖,那么父节点是没有被覆盖(先不装监控,结合该节点的父亲的情况处理)
(3)左右孩子有1个或以上装了监控(另外一个是已覆盖状态),那么当前节点都是已被覆盖。
用以下数字表示节点的状态
0 - 该节点没有被覆盖
1 - 该节点上装有监控
2 - 该节点已被覆盖
*/
int get_status(TreeNode * root){
if(root == NULL)
return 2;
int left_status = get_status(root->left);
int right_status = get_status(root->right);
//左右孩子其中有1个没被覆盖,那么父节点装监控。
if(left_status == 0 || right_status == 0){
ans++;
return 1;
}
//左右孩子若都被覆盖,那么父节点是没有被覆盖(先不装监控,结合该节点的父亲的情况处理)
if(left_status + right_status == 4){
return 0;
}
//左右孩子有1个或以上装了监控(另外一个是已覆盖状态),那么当前节点都是已被覆盖。
if(left_status + right_status >= 2){
return 2;
}
return -1;
}
int minCameraCover(TreeNode* root) {
if(get_status(root) == 0)
ans++;//由于未覆盖的节点都是交由其父亲处理,所以可能存在根未被覆盖的情况
return ans;
}
};