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:很容易找到的第一大/第一小;第二大/第二小;第三大/第三小……