前言
Weekly Contest 115的 二叉树的完全性检验:
给定一个二叉树,确定它是否是一个完全二叉树。
百度百科中对完全二叉树的定义如下:
若设二叉树的深度为
h
,除第h
层外,其它各层 (1~h-1
) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第h
层可能包含1~ 2h
个节点。)示例1:
输入:[1,2,3,4,5,6] 输出:true 解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。
示例2:
输入:[1,2,3,4,5,null,7] 输出:false 解释:值为 7 的结点没有尽可能靠向左侧。
提示:
- 树中将会有
1
到100
个结点。
解题思路
本题基本没有难度,且在完全二叉树的百度百科中已经给出了思路:
判断一棵树是否是完全二叉树的思路
- 如果树为空,则直接返回
false
如果树不为空:层序遍历二叉树
- 如果一个结点左右孩子都不为空,则
pop
该节点,将其左右孩子入队列;- 如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
- 如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树;
实现代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
* 958. 二叉树的完全性检验
* @param root
* @return
*/
public boolean isCompleteTree(TreeNode root) {
boolean flag=true;
//左子树的标志位
boolean isLeft=false;
if(root!=null){
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while (queue.size()!=0){
TreeNode node=queue.poll();
TreeNode left=node.left;
TreeNode right=node.right;
if((left==null && right!=null)//左节点为null,且右节点不为null(是否为叶子节点)
|| (isLeft && (left!=null || right!=null))){//如果为左子树,则左右节点都不能为null
flag=false;
break;
}
if(left!=null){
queue.offer(left);
}
if(right!=null){
queue.offer(right);
}else{
isLeft=true;
}
}
}else{
flag=false;
}
return flag;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。