958. 二叉树的完全性检验
难度中等
给定一个二叉树的 root
,确定它是否是一个 完全二叉树 。
在一个 完全二叉树 中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点都是尽可能靠左的。它可以包含 1
到 2h
节点之间的最后一级 h
。
示例 1:
输入:root = [1,2,3,4,5,6] 输出:true 解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。
示例 2:
输入:root = [1,2,3,4,5,null,7] 输出:false 解释:值为 7 的结点没有尽可能靠向左侧。
提示:
- 树的结点数在范围
[1, 100]
内。 1 <= Node.val <= 1000
迭代法
- 层序遍历每一个节点,知道遍历完所有的节点为止,退出
- 然后将队列节点依次弹出,如果发现不为空则不是完全二叉树
原因是完全二叉树的节点从左往右的节点中间不能有空隙
所以我们使用层序遍历,直到遍历完每一个节点退出循环(对于叶子节点,左右孩子为空也要进队列). 然后依次弹出队列中剩余节点,如果弹出节点有一个不为空,那证明从左往右中间肯定有空隙,所以就不是一颗完全二叉树.
class Solution {
public boolean isCompleteTree(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//层序遍历每一个节点,知道遍历完所有的节点为止,退出
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
if(cur==null) {
break;
}
queue.offer(cur.left);
queue.offer(cur.right);
}
//然后将队列节点依次弹出,如果发现不为空则不是完全二叉树
while(!queue.isEmpty()){
if(queue.poll()!=null){
return false;
}
}
return true;
}
}