/*
* 判断是否为完全二叉树:
* 完全二叉树:除叶子节点外的节点都包含左右节点,此为满二叉树;不为满二叉树,但是叶子节点都集中在左边,没有节点存在有右子树但是没有左子树的情况,也为完全二叉树
* 所以要判断的情况:
* 1、一个节点有右子树但是没有左子树,返回false
* 2、一个节点有左子树没有右子树,此时要求此节点之后的所有节点都为叶子节点,否则返回false
*
* 下面代码的实现思路:利用LinkedList模拟队列,利用其先进先出的特点来便于依次处理节点;
* 设置一个标记判断是否有子树的存在,这个标记会变成true当且仅当左子树为空或右子树为空的时候;
* 一旦该标记为true,后续出现节点存在子树直接返回false即可。
* */
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
class TreeNode {//接口实现要放在类定义外面
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class findKelem {
public boolean idBinaryTree(TreeNode root){
if(root == null){
return false;
}
Queue<TreeNode> queue=new LinkedList<TreeNode>();//利用队列先进先出的特性来层次遍历地处理各个节点
queue.offer(root);
//为true的情况只有当左子树或右子树为空的情况,一旦标记为true后,该节点之后的所有节点只能为叶子节点;若是左子树为空使得noChild为true的情况,当前节点有右节点也要返回false
boolean noChild=false;
while(!queue.isEmpty()){
TreeNode cur=queue.poll();
if(cur.left != null){
if(noChild){
return false;
}
queue.offer(cur.left);
}
else{
noChild=true;
}
if(cur.right != null){
if(noChild){
return false;
}
queue.offer(cur.right);
}
else{
noChild=true;
}
}
return true;
}
public static void main(String[] args) {
TreeNode root = new TreeNode(0);
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(3);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;//node2时为false,node1时未true
findKelem test = new findKelem();
boolean result = test.idBinaryTree(root);
System.out.println(result);
}
}
判断一棵二叉树是否为完全二叉树
猜你喜欢
转载自blog.csdn.net/cyanchen666/article/details/81980813
今日推荐
周排行