968. 监控二叉树

47 阅读1分钟

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

let dp =[[0,0], [0,0]]
getDp(root, dp);
/* 根节点没有父节点, 所以父节点就是不放 */
console.log(dp)
return Math.min(dp[0][0], dp[0][1])
};

function getDp(root, dp ){
    if(!root){
        dp[0][0] = 0   ;  // 父子都不放
        dp[0][1] = 10000; // 父不放 当前节点放, 那是不可能的
        dp[1][0] = 0 ; // 父放 子理当不放
        dp[1][1] = 10000; // 子没有放不了
    return ;
    }
    if(!root.left && !root.right){
         dp[0][0] = 10000   ;  // 父子都不放 那是不可能的 
        dp[0][1] = 1; // 父不放 当前节点放
        dp[1][0] = 0 ; // 父放 子理当不放
        dp[1][1] = 1;
    }
    let l = [[0,0], [0,0]], r =[[0,0], [0,0]];
    getDp(root.left, l)
    getDp(root.right, r);
    /* 柯理化 不就可以使得这种接受两个参数的函数, 变成接收任意个参数的 */
    dp[0][0] = Math.min(l[0][0]+ r[0][1], l[0][1] + r[0][0], l[0][1]+ r[0][1]);
    dp[0][1] = Math.min(l[1][0]+ r[1][0], l[1][1] + r[1][0], l[1][1]+ r[1][1], l[1][0]+ r[1][1]) + 1;
    /* 因为父节点放不放 不影响当前子树完全检测,所以下面直接与上面比较, 但是当前节点放不放就很影响了 */
    dp[1][0] = Math.min(dp[0][0],l[0][0]+ r[0][0]);
    dp[1][1] = dp[0][1]
return ;
}