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;
    }
};
posted @ 2020-09-22 21:57  童年の波鞋  阅读(179)  评论(0编辑  收藏  举报