
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源
去关联
给定一个二叉树,判定是否完全二叉树?
完全二叉树定义如下:
若二叉树的深度是
h
,除了第h层
之外,其他各个层的节点数量都达到了最大的个数;第h层
的叶子节点都连续集中在最左边,这就是完全二叉树。
满二叉树一定是完全二叉树,反之则不然。
示例:
队列是一种仅仅支持在表尾插入操作、表头进行删除操作的线性表,插入端称之为队尾,删除端称之为队头。满足先进先出原则,元素入队即将新元素加在队列的尾,元素出队即将队首元素取出,它后一个作为新的队首。
Java队列主要分为了阻塞
、非阻塞
、单向链表
、以及双向链表
。
Java队列的接口继承关系图:
优先队列,是0或者多个元素构成的集合,并且在集合中,按照某种排序方式(元素自身的权重)来进行排序,不会保证元素内部整体有序,但是每次弹出的元素优先级最高或者最低。
其内部数据结构是堆。堆底层是完全二叉树,对于树的存储包含有链式存储或者顺序存储
。PriorityQueue使用了顺序存储,所以利用了Object[]数组,然后利用完全二叉树的性质,解决了父子节点关系的问题。
注意:默认实现是==小根堆==。
对于完全二叉树最重要的定义就是叶子节点只能够出现在最下层或者次下层。因此我们可以利用辅助队列来来实现层序遍历——从上层遍历到下层,每一层从左至右。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isCompleteTree (TreeNode root) {
// write code here
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
TreeNode cur;
//定义一个首次出现的标记位
boolean flag = false;
while (!queue.isEmpty()) {
cur = queue.poll();
if (cur == null) {
flag = true;
continue;
}
if (flag) {
return false;
}
queue.offer(cur.left);
queue.offer(cur.right);
}
return true;
}
}