题目
给定一个二叉树,确定它是否是一个完全二叉树。
百度百科中对完全二叉树的定义如下:
若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)
解法
思路:
- 层次遍历二叉树,遇到第一个左右不全空的节点,则做上标记
- 如果存在节点左孩子为空,右孩子不为空,则返回false 代码(l == null && r != null)
- 再2不违规情况下,第一个左右孩子都为空的节点,且后续节点皆为叶节点才是完全二叉树 代码(index && (l != null || r != null))
class Solution {
//思路:二叉树的层次遍历
public boolean isCompleteTree(TreeNode root) {
return widthOrder(root);
}
public boolean widthOrder(TreeNode root){
if(root == null){
return false;
}
//1.如果任意一个节点有右子树无左子树 false
//2.再条件1不违规情况下,第一个左右孩子都为空的节点,且后续节点皆为叶节点才是完全二叉树
LinkedList<TreeNode> list = new LinkedList<>();
list.add(root);
boolean index = false; //是否遇到左右孩子不双全的节点
TreeNode l = root.left;
TreeNode r = root.right;
while(!list.isEmpty()){
TreeNode cur = list.poll();
l = cur.left;
r = cur.right;
//上述2个条件的转换代码 (l != null || r != null)如果为true则不是叶节点
if((l == null && r != null) || (index && (l != null || r != null))){
return false;
}
if(l != null){
list.add(l);
}
if(r != null){
list.add(r);
}
if(l == null || r == null){
index = true;
}
}
return true;
}
}