力扣-监控二叉树

118 阅读1分钟
/**
 * 假设整棵树都被覆盖
 * 假设1:如果在root处安装摄像头的话,那么left,right也一定可以被监控到,此外保证left与right的子节点也可以被监控
 * 假设2:如果root未安装摄像头的话,那么left与right其中一必须安装有摄像头
 *
 * 状态 a:root 必须放置摄像头的情况下,覆盖整棵树需要的摄像头数目。
 * 状态 b:覆盖整棵树需要的摄像头数目,无论root 是否放置摄像头。
 * 状态 c:覆盖两棵子树需要的摄像头数目,无论节点root 本身是否被监控到。
 *
 * 对于root节点,我们设其左右left与right 的变量为 {la,lb,lc} 与 {ra, rb,rc}
 *
 * 从而得出求解a,b
 * a  = lc + rc + 1 // 需要的总数目
 * b = min(a, min(la+ ra, lb +rb))
 *
 */

// 后序
function f(root) {
    const dfs = (root) =>{
        if (!root) return 0
        const [la,lb,lc] = dfs(root.left)
        const [ra, rb, rc] = dfs(root.right)
        const a = lc + rc +1
        const b = Math.min(a, Math.min(la+ rb, lb+ ra))
        const c = Math.min(b, lb + rb)
        return [a, b, c]
    }
    return dfs(root)[1]
}