刷题使我快乐,满脸开心.jpg
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/ch…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给你一棵二叉树的根节点 root ,请你判断这棵树是否是一棵 完全二叉树 。
在一棵 完全二叉树 中,除了最后一层外,所有层都被完全填满,并且最后一层中的所有节点都尽可能靠左。最后一层(第 h 层)中可以包含 1 到 2h 个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:true
解释:最后一层前的每一层都是满的(即,节点值为 {1} 和 {2,3} 的两层),且最后一层中的所有节点({4,5,6})尽可能靠左。
示例 2:
输入:root = [1,2,3,4,5,null,7]
输出:false
解释:值为 7 的节点不满足条件「节点尽可能靠左」。
提示:
- 树中节点数目在范围
[1, 100]内 1 <= Node.val <= 1000
思路
这个题目其实挺简单的,别被它唬住就好
完全二叉树
- 除最后一层必须完全填满
- 最后一层即使不满,也需要保证空隙的右边再没有节点
翻译成思路逻辑:
- 出现空隙后,不能再有下一层节点
- 出现空隙后,不能再有右边的节点
所以我直接选择了BFS,很适合实现这个思路逻辑
具体不用多说了,直接上代码,细节在注释
代码
func isCompleteTree(root *TreeNode) bool {
// 表明是否出现空隙
notFull := false
// 选用BFS,辅助变量
nodeList := []*TreeNode{root}
temp := make([]*TreeNode, 0)
for len(nodeList) > 0 {
for _, node := range nodeList {
// 已经出现空隙了,还有下一层或者后续节点有子节点,那就不满足了
if notFull && (node.Left != nil || node.Right != nil) {
return false
// 左边有空隙,右边有子节点,那就直接可以返回false了
} else if node.Left == nil && node.Right != nil {
return false
// 左右子节点都满的,加入下一层遍历节点中
} else if node.Left != nil && node.Right != nil {
temp = append(temp, node.Left)
temp = append(temp, node.Right)
// 右子节缺失,左子节点加入下一层遍历节点中,并且声明已经出现空隙
} else if node.Left != nil && node.Right == nil {
temp = append(temp, node.Left)
notFull = true
// 剩下的其实是左右子节点都为空的情况,声明出现空隙
} else {
notFull = true
}
}
nodeList = temp
temp = nil
}
return true
}
欢迎关注公众号交流更多题目~