验证一棵二叉树是否是完全二叉树,
完全二叉树是指,非叶子层的节点不能有null,也就是说节点个数满足2n-1,n为所在层数。
叶子层如果节点没填满,那么节点要靠左,不能出现左节点为null, 而右节点不为null的情况。
思路:
树的前序中序后序遍历只能看到一部分,而看不到整个一层是否缺节点。
因此需要层遍历,类似BFS。
是否缺节点可以验证第n层的节点个数是否为2n-1,但是在缺节点的情况下不能验证节点是不是靠左。
这样吧,把所有层的节点按层摊开,摊成一行,
由于完全二叉树的非叶子层必须是满的,叶子层节点又必须靠左,
最终摊开的节点必然会出现null节点在最后的情况,如果null出现在中间,则不是完全二叉树。
比如把上面example2的节点摊开:
1,2,3,4,5,null, 7
null出现在中间,不是完全二叉树。
一般BFS是不把null节点加进queue的,
但是这次要把null也加进queue, 这样如果出现null节点之后又出现了非null节点,证明节点不是靠左的,或者非叶子层有空节点。返回false。
public boolean isCompleteTree(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean notFull = false;
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
if(cur == null) notFull = true; //出现了null节点
else {
if(notFull) return false; //null节点之后出现了非null节点
queue.offer(cur.left);
queue.offer(cur.right);
}
}
return true;
}