给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
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 ;
}