【力扣】968. 监控二叉树
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-cameras
思考:
根据题目:每个节点可以有三个状态: 0 未被监控覆盖到、1 已经被覆盖到、2当前节点就是监控点
int result = 0; public int minCameraCover(TreeNode root) { //随便给一个二叉树 //根据题目:每个节点可以有三个状态: 0 未被监控覆盖到、1 已经被覆盖到、2当前节点就是监控点 //如果当前节点是一个叶子节点,因为他是没有子节点的,所以可以认为它的子节点已经被覆盖了,也就是1 if(dfs(root) == 0){ result++; } return result; } public int dfs(TreeNode root){ if(root == null){ // 如果当前是空的,则任务当前节点被监控覆盖了 return 1; } int leftValue = dfs(root.left); int rightValue = dfs(root.right); if(leftValue == 1 && rightValue == 1){ // 如果两个叶子节点都被监控覆盖了,那么当前节点就没有被监控 return 0; } if(leftValue == 0 || rightValue == 0){ //说明这两个叶子节点有个没有被监控 result++; return 2; } //否则,说明有个叶子节点为2 ,那么就直接把当前节点设置为被监控到 return 1; }
一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻