a_lc_监控二叉树(后序遍历+状态返回)
思路
用0、1、2分别记录三种状态:
- 0:子结点尚未被监控
- 1:子节点被监控了
- 2:根节点被监控
根节点为空时,自然不需要监控,那这种情况下默认根结点被监控;子节点之一没有被监控,则在当前结点安装监控;
class Solution {
public:
int ans;
int dfs(TreeNode* root) {
if (root==NULL) return 2;
int l=dfs(root->left), r=dfs(root->right);
if (l==0 || r==0) { //子节点之一没有监控,则需在此处安装摄像
ans++;
return 1; //在当前结点安装了监控,那对于它的直接父节点来说就是子节点有监控
} else if (l==1 || r==1) { //子节点之一有监控,则当前父节点一定有监控
return 2;
} else { //l=r=2是子节点的状态,表示当前结点的子节点可被它的子节点监控,也就是说当前结点没被监控到
return 0;
}
}
int minCameraCover(TreeNode* root) {
return dfs(root)==0?ans+1:ans;
}
};