描述
给定一个二叉树,确定他是否是一个完全二叉树。
完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)
数据范围:节点数满足 1 \le n \le 100 \1≤n≤100
样例图1:
我的解法:
将这颗二叉树层序遍历保存到数组或集合中,然后遍历数组,若出现null值后,后面就必须全是null值,若不是,说明不是完全二叉树
其他解法:
定义一个全局的深度参数,对该二叉树进行前序遍历,当第一次出现null值时,记录当前的深度,之后再遍历到该深度的节点时,如果不是null值,说明不是完全二叉树,如果出现null值的深度不是记录的值,说明不是完全二叉树,如果超过记录值的深度,说明不是完全二叉树(略)
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
ArrayList<ArrayList<Integer>>t=new ArrayList<>();
public boolean isCompleteTree (TreeNode root) {
//该方法为层序遍历保存数据到该集合
a(root,0);
//遍历该集合
for(int i=0;i<t.size();i++){
for(int j=0;j<t.get(i).size();j++){
if(t.get(i).get(j)==null){
if(j==t.get(i).size()-1){
if(i!=t.size()-1){
if(t.get(i+1).get(0)!=null)
return false;
}
}else{
if(t.get(i).get(j+1)!=null)
return false;
}
}
}
}
return true;
}
public void a(TreeNode root,int deep){
//层序遍历
ArrayList<Integer> temp;
if(t.size()-1<deep){
temp=new ArrayList<>();
temp.add(root==null?null:root.val);
t.add(temp);
}else{
temp=t.get(deep);
temp.add(root==null?null:root.val);
t.set(deep,temp);
}
if(root==null)
return;
a(root.left,deep+1);
a(root.right,deep+1);
}