完全二叉树
- 完全二叉树是指除了最后一层之外(叶子结点所在的一层),其他每一层的结点数都是满的(每个非叶子结点都拥有左右子孩子)。
- 最后一层如果也满了,是一颗满二叉树,也是完全二叉树。
- 最后一层如果不满,缺少的结点也全部的集中在左边(若一个结点只有有孩子,则该树,不是完全二叉树),那也是一颗完全二叉树。
- 使用:广度优先遍历的方式,数据结构采用:队列 QUEUE;
- Queue queue = new LinkedList<>(); 这里使用链表实现队列。
- queue.poll()方法与queue.remove()方法,都是从队列中取出头元素。区别在于,前者当队列为空时返回null,后者当队列为空时会抛出NoSuchElementException异常。
remove
E remove()
Retrieves and removes the head of this queue. This method differs from poll only in that it throws an exception if this queue is empty.
Returns:the head of this queueThrows:NoSuchElementException - if this queue is empty
import java.util.LinkedList;
import java.util.Queue;
public class test222 {
public static void main(String[] args){
Node root=new Node(1);
buildTree(root);
System.out.println(isCompleteTree(root));
}
public static boolean isCompleteTree(Node root){
boolean leaf = false;
if(root==null){
return true;
}
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
Node pre = queue.poll();
Node right = pre.right;
Node left = pre.left;
if((leaf && (left!=null || right!=null))||(left==null && right!=null)){
return false;
}
if(left!=null){
queue.add(left);
}
if(right!=null){
queue.add(right);
}else {
leaf = true;
}
}
return true;
}
//生成一颗二叉树
public static void buildTree(Node root){
Node now;
Node left=new Node(2);
Node right=new Node(3);
root.left=left;
root.right=right;
left=new Node(4);
right=new Node(5);
now=root.left;
now.left=left;
now.right=right;
left=new Node(6);
right=new Node(7);
now=root.right;
now.left=left;
now.right=right;
left=new Node(8);
right=new Node(9);
now=root.left.left;
now.left=left; //返回结果为:true
now = root.left.right;
now.right = right;//返回结果为:false
}
}
Node类:
public class Node {
int val;
Node left = null;
Node right = null;
Node(int data){
this.val = data;
}
}