判断一棵树是否是一个完全二叉树?

完全二叉树

  • 完全二叉树是指除了最后一层之外(叶子结点所在的一层),其他每一层的结点数都是满的(每个非叶子结点都拥有左右子孩子)。
  • 最后一层如果也满了,是一颗满二叉树,也是完全二叉树。
  • 最后一层如果不满,缺少的结点也全部的集中在左边(若一个结点只有有孩子,则该树,不是完全二叉树),那也是一颗完全二叉树。
  • 使用:广度优先遍历的方式,数据结构采用:队列 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值