二叉树_完全二叉树的判定

1.判断一颗树是不是完全二叉树

思路解析

核心思路:利用层次遍历,只要遇到一个空结点,若剩余全是空结点, 则此树是完全二叉树;反之不是完全二叉树。

注意:无论结点是否为空结点,都必须把左右孩子入队列。
         1.结束条件是取出的队首元素是空结点时,跳出循环;
         2.在循环外判断队列中的元素是否全部为空。
在这里插入图片描述

在这里插入图片描述

程序测试

public class LevelOrder {
    private static class Node {
        char val;
        Node left;
        Node right;
        Node(char val) {
          this.val = val;
        }
    }
    
    public static boolean isCompleteTree(Node root) {
        if (root == null) { //空树是完全二叉树
            return true;
        }
        Queue<Node> queue = new LinkedList<>(); 
        queue.offer(root); //根入队列
        while (true) {
            Node front = queue.poll(); //取队首元素
            
            // 判断 front 是不是空结点
            if (front == null) {
                break; //跳出循环
            }
            
            queue.offer(front.left); //无论是否为空 左右孩子都必须入队列
            queue.offer(front.right);
        }
        
        // 去检查队列中是否全为 null 了
        while (!queue.isEmpty()) {
            Node n = queue.poll();
            if (n != null) {
                return false;  //队列中有非空结点 不是完全二叉树
            }
        }

        return true;
    }
 }

2.完全二叉树应用

堆 ==》 完全二叉树

借助堆,可以很高效的找到一组数据中最大/最小值;可以解决 TOPk 问题。

eg:很容易找到的第一大/第一小;第二大/第二小;第三大/第三小……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值