968、监控二叉树
基本思想:
贪心
具体实现:
从下往上看,
局部最优:让叶子节点的父节点安摄像头,所用摄像头最少
整体最优:全部摄像头数量所用最少
确定遍历顺序:后序遍历
节点的三种状态用三个数字表示:
0.本节点无覆盖
1.本节点有摄像头
2.本节点有覆盖
空节点的状态是有覆盖
递归终止条件:遇到空节点,并返回2(有覆盖)
单层逻辑:
1.左右节点都有覆盖,当前节点就无覆盖,返回0,不需要放摄像头
2.左右节点至少一个无覆盖,当前节点需要放摄像头,返回1,并result++
3.左右节点至少一个有摄像头,当前节点覆盖了,返回2
这个图中先判断情况2,在判断情况3
4.头结点没有覆盖,直接result++
代码:
class Solution { private int count = 0; public int minCameraCover(TreeNode root) { if (trval(root) == 0) count++;//情况4 return count; } private int trval(TreeNode root){ if (root == null) return 2;//空节点,该节点有覆盖 int left = trval(root.left); int right = trval(root.right); if (left == 2 && right == 2){// 情况1 return 0; }else if(left == 0 || right == 0){//情况2 count++; return 1; }else{ return 2;//情况3 } } }