题目:
给定一个二叉树的 root ,确定它是否是一个 完全二叉树 。
在一个 完全二叉树 中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点都是尽可能靠左的。它可以包含 1 到 2h 节点之间的最后一级 h 。
算法:
方法一:层序遍历
层序遍历访问到空节点之后,如果还有节点,说明不是完全二叉树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isCompleteTree(root *TreeNode) bool {
reachNull := false
queue := []*TreeNode{root}
for len(queue) > 0 {
n := len(queue)
for i := 0; i < n ; i ++ {
if reachNull && queue[i] != nil {
return false
}
if queue[i] == nil {
reachNull = true
} else {
queue = append(queue, queue[i].Left)
queue = append(queue, queue[i].Right)
}
}
queue = queue[n:]
}
return true
}
方法二:BFS
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isCompleteTree(root *TreeNode) bool {
maxNodeNum, count := 0, 0
var dfs func(node *TreeNode, k int) bool
dfs = func(node *TreeNode, k int) bool {
if node == nil {
return true
}
count ++
maxNodeNum = max(maxNodeNum, k)
return dfs(node.Left, 2 * k) && dfs(node.Right, 2 * k + 1)
}
if !dfs(root, 1) {
return false
}
return maxNodeNum == count
}
func max(a, b int) int {
if a > b {
return a
}
return b
}