0968:监控二叉树(2124 分)
目录
题目
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0] 输出:2 解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
- 给定树的节点数的范围是
[1, 1000]
。 - 每个节点的值都是 0。
相似问题:
分析
- 按根节点装不装讨论
- 根节点装,转为求 “子树根节点不用监视情况下的最小数量”
- 根节点不装,子树中至少有一个要装在根节点,转为求 “根节点装的情况下的最小数量”
- 因此令 dfs 同时返回 “所有情况的最小数量”、“根节点装时的最小数量”、“不用监视根节点时的最小数量”,进行递推
- 假设左子树返回的 l1,l2,l3,右子树返回的 r1,r2,r3
- 根节点装时,显然就是 1+l3+r3
- 根节点不装时,要么左子树根节点装,为 l2+r1,要么右子树根节点装,为 l1+r2
- 不用监视根节点时,要么根节点装,为 1+l3+r3,要么根节点不装,为 l1+r1
解答
|
|
7 ms