/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcisCompleteTree(root *TreeNode)bool { q := []*TreeNode{root} // 队列 var flag bool// 标记是否已经碰到过左/右子树为空的节点
// 开始层序遍历 for i := 0; len(q) > 0; i++ { p := []*TreeNode{} // p记录下一层节点 for j := 0; j < len(q); j++ { cur := q[j] // 当前遍历节点
if cur.Left != nil && !flag{ // 左子树入队 p = append(p, cur.Left) } elseif cur.Left != nil && flag{ // 已经遇到了左/右子树为空的节点,且当前节点的左子树非空,不是完全二叉树 returnfalse } else { flag = true }
if cur.Right != nil && !flag{ // 右子树入队 p = append(p, cur.Right) } elseif cur.Right != nil && flag{ // 已经遇到了左/右子树为空的节点,且当前节点的右子树非空,不是完全二叉树 returnfalse } else { flag = true } } q = p // 访问下一层节点 }