968 监控二叉树
代码如下
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func minCameraCover(root *TreeNode) int {
res := 0
var traversal func(cur *TreeNode) int
traversal = func(cur *TreeNode) int {
if cur == nil { //首先明确各个数字代表的状态 0 代表无覆盖 1 代表有摄像头 2 代表有覆盖 如果遇到叶子节点则需要返回,叶子节点的子节点为空,空节点代表有覆盖的状态,所以返回2
return 2
}
left := traversal(cur.Left) //进行后序遍历
right := traversal(cur.Right)
if left == 2 && right == 2 { //中间的处理逻辑分为三类 第一种是如果两个叶子节点都为有覆盖的状态,那么这个父节点则为无覆盖的状态,因为这个节点的两个子节点都为有覆盖所以这个节点不需要覆盖,只要这个节点的父节点为摄像头即可
return 0
}
if left == 0 || right == 0 { //如果其中一个子节点为无覆盖,那么就需要在这个节点设置摄像头并返回1
res++
return 1
}
if left == 1 || right == 1 { //如果其中有一个子节点有摄像头说明此处无需覆盖
return 2
}
return -1
}
if traversal(root) == 0 { 如果根节点是无覆盖的状态,那么就需要在根节点设置一个摄像头
res++
}
return res
}