Leetcode968
1.问题描述
2.解决方案
思路总结:
1,第一步当然是确定大致思路,核心问题摄像头往哪放,其实这个很好想,那就隔一层放一个呗,问题是从根节点开始一层隔一个呢还是从叶子节点一层隔一个呢,如图
2.确定遍历顺序,这个后序遍历真的有非常重要的用途,首先就是需要从叶子遍历到根节点的用途,其次就是也是需要从叶子到根并且需要根据儿子结点的状态推导父亲结点的状态时
3.核心问题来了如何进行从叶子到根结点,从儿子节点到父亲节点的状态递推,当然第一步要进行状态定义
4.由于是后序遍历嘛,递归涉及到一个递归终止点,也就是空结点怎么定义状态这也直接决定了叶子结点的初始状态
5.最后一点需要考虑的就是递推式了,共分四种情况
情况一:两个子节点都是有覆盖
情况二:两个子节点至少有一个无覆盖
情况三:两个子节点至少有一个有摄像头
情况四:头节点没有覆盖
//1.
if(left==2&&right==2) return 0;
//2.
if(left==0||right==0){
result++;
return 1;
}
//3.
if(left==1||right==1) return 2;
if(traversal(root)==0) return result+1;
总结:
1.再遇到类似的题希望能有点经验就是,第一个就是这个后序遍历很有用,前面已经说过
2.就是一个树不同的结点有不同的属性,那么自然要想到定义状态,然后以某种顺序进行遍历然后状态递推或者转移
代码实现:
class Solution {
public:
int result=0;
//0:无覆盖 1:有摄像头 2:有覆盖
int traversal(TreeNode* root){
if(root==nullptr) return 2;
int left= traversal(root->left);
int right= traversal(root->right);
//1.
if(left==2&&right==2) return 0;
//2.
if(left==0||right==0){
result++;
return 1;
}
//3.
if(left==1||right==1) return 2;
//为了过编译
return 0;
}
int minCameraCover(TreeNode* root) {
if(traversal(root)==0) return result+1;
else return result;
}
};