958. 二叉树的完全性检验

88 阅读1分钟

题目:
给定一个二叉树的 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
}