牛客BM 35 判断是否为完全二叉树
定义:
完全二叉树可以看做是,满二叉树从最后一个结点开始向前删掉结点;
完全二叉树去掉最后一层是一颗满二叉树,最后一层的结点在遇到最后一个结点之前,没有空结点
思路:层序遍历
- 若当前结点空则flag标记为true,继续遍历
- 若当前结点不为空且flag为false,这将结点的左右孩子入队;若flag为true,则表明之前遇到过空结点,不符合完全二叉树的定义,返回false
代码:
public boolean isCompleteTree (TreeNode root) {
if(root == null) return true;//空
Queue<TreeNode> que = new LinkedList<TreeNode>();//因为后面有可能要将null入队
que.offer(root);
boolean flag = false;//遇到了空结点
while(!que.isEmpty()) {//层序遍历框架下又精简了size
TreeNode cur = que.poll();
if(cur == null) {
flag = true;
}else {
if(flag) return false;
que.offer(cur.left);
que.offer(cur.right);
que.add(cur);
}
}//while
return true;
}//fun
注意点
一般遍历时,我们都不会将空结点入队,所以之前都是用的LinkedBlockingQueue,但完全二叉树的验证需要验证在最后一个结点之前是否有空结点出现,这就要求队列能存储null,所以需要的队列是LinkedList。
Queue<TreeNode> que = new LinkedBlockingList<TreeNode>();//不能存储null
Queue<TreeNode> que = new LinkedList<TreeNode>();//可存储null
冷门知识
LinkedList既实现了双链表的功能又实现了队列的功能
树结点的定义
public static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}//TreeNode