给定一个二叉树,确定他是否是一个完全二叉树。
完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)
数据范围:节点数满足
样例图1:
样例图2:
样例图3:
{1,2,3,4,5,6}
true
{1,2,3,4,5,6,7}
true
{1,2,3,4,5,#,6}
false
func isCompleteTree(root *TreeNode) bool { var queue = list.New() var count = 0 queue.PushBack(root) for queue.Len() != 0 { size := queue.Len() count++ mayCount := int(math.Pow(float64(2), float64(count-1))) var isComplete = true for i := 0; i < size; i++ { node := queue.Front().Value.(*TreeNode) queue.Remove(queue.Front()) if size != mayCount && (node.Left != nil || node.Right != nil) { return false } if node.Right != nil && node.Left == nil { return false } if (node.Left != nil || node.Right != nil) && isComplete == false { return false } if node.Left == nil || node.Right == nil { isComplete = false } if node.Left != nil { queue.PushBack(node.Left) } if node.Right != nil { queue.PushBack(node.Right) } } } return true // write code here }
package main import . "nc_tools" /* * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return bool布尔型 */ func isCompleteTree(root *TreeNode) bool { if root == nil { return true } notComplete := false queue := []*TreeNode{root} for len(queue) > 0 { tempQueue := []*TreeNode{} for _, node := range queue { if node == nil { notComplete = true continue } if notComplete { return false // 第二次出现空节点 } tempQueue = append(tempQueue, node.Left) tempQueue = append(tempQueue, node.Right) } queue = tempQueue } return true }