题目描述
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例
输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足以监控所有节点。
思路:
我始终认为,拿到一道题目先弄明白逻辑是最重要的。
这道题目利用了二叉树的遍历,从叶子节点开始,为了能让摄像头数量最小,叶子结点一定是被覆盖的,因此是左右中的遍历顺序,这样子后序遍历的框架就可以拿出来了。
首先定义几个状态:
1:摄像头节点;
-1:被覆盖的节点;
0:没有被覆盖的节点;
递归遍历该二叉树,如果该节点为空,那么返回-1;
如果该节点的左右子树都是-1,都被覆盖过,那么该节点为0;
如果该节点的左右孩子有摄像头,那么该节点被覆盖,记作-1;
如果该节点的左右孩子存在没有被覆盖的节点,那么该节点要为摄像头节点,记作1;
因此代码为
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int result;
int traversal(TreeNode* cur)
{
if(cur==NULL) return -1;
int left=traversal(cur->left);
int right=traversal(cur->right);
if(left==-1 && right==-1) return 0;
else if(left==0 || right==0)
{
result++;
return 1;
}
else
return -1;
}
public:
int minCameraCover(TreeNode* root) {
//中序遍历.1.摄像头节点;-1:被覆盖的节点;0:没有覆盖的节点
result=0;
if(root==NULL) return 0;
if(traversal(root)==0)
{
result++;
}
return result;
}
};