`
小篮子java的家
  • 浏览: 32420 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

优先队列、treeset内部结构大比拼

阅读更多

 

首先要了解队列的存储结构里是数组,而treeset的存储结构是链表
队列中逻辑结构是二叉堆(小顶堆),treeset中逻辑结构是排序二叉树

先解释一下什么是二叉堆和排序二叉树首先从树说起

 


它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前驱。

 

 

 

二叉树
在树的基础上,所有结点的子结点个数小于或等于二

 

 

 


完全二叉树
首先在二叉树的基础上,除了最后一个节点所有节点都有左右两个子节点的二叉树

 

二叉堆(小顶堆)
* 是一个完全二叉树
* 最小的元素在顶端  
* 每个元素都比它的父节点大,或者和父节点相等。

 

 

 


排序二叉树
 (1) 是一个二叉树
(2)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(3)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(4)左、右子树也分别为二叉排序树

 

 

 

 


优先队列的和treeset的内部结构展示

 

 

 

 

优先队列和treeset的思路实现

   优先队列
 * 添加元素  首先把要添加的元素加到数组的末尾,然后和它的父节点比较,如果新元素比父节点元素小则交换这两个元素,然后再和新位置的父节点比较,直到它的父节点不
再比它大,结束。  

 

 

 

 

 

 

 * 删除元素  删除元素的过程和添加类似,只不过添加元素是“向上比较”,而删除元素是先“向下比较”:找到要删除元素的下标位置,把最后一个元素移到该位置,然后和它的两个子节点比较
1如果较小的子节点比它小就将它们交换,直到两个子节点都比它大。
2如果移到该位置时,它已经比子节点小则像添加元素那样“向上比较”,直到父结点比它大为止。

 

 

 

 

 

  treeset
 

 

*添加元素  从根节点往下比较,小于往左走,大于往右走,依次循环。直到和其比较的结点为空。空结点的父结点,即为要加入元素的父节点。实例化成结点对象,再比较大小后,将结点挂在其父节点下。

<图略>
 
 *删除元素  找到元素所在的节点位置

1--当结点node有左右子女时,往下所搜与node中的元素最为接近的元素的结点,找到后将该结点的元素值赋给node,让node指向该结点, 接下来删除这个结点。 注意:最后要去掉的节点的子女个数都是小于2的。

2---当结点node只有一个子女时,然后直接将子女链在其父结点后。

3----当结点node无子女时,使其为null,即删除

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics