【问题标题】:Trees and priority queues树和优先级队列
【发布时间】:2013-05-16 20:08:53
【问题描述】:

我正在尝试解决一个有点困难的练习,因为我必须从树的模板类(一种 RedBlack 或 BinarySearch 树)开始实现优先级队列。

使用看起来像的模板

class Node
  int key
  Node left
  Node right
  Node parent
  int leftNodes
  int rightNodes

最初,当我必须插入一个新元素时,我尝试完全填充树的一个级别,然后使用 InOrderTreeTRaversal/Sort 算法填充一个数组并从该数组生成一个 BinarySearch 树并用新的根元素替换原来的。假设结果是一棵平衡树。

不幸的是,这种方法似乎不合适,因为树必须模拟 maxheap 属性 为每次插入/删除维护 平衡 树(而且我的代码在填充时效果不佳完全是树级别)。有可能实现具有堆功能的树吗?我的意思是一棵树,它的每个元素都大于或等于它的子元素,在插入后保持平衡,并且在删除根节点(更大的关键元素)时具有自动平衡功能?

【问题讨论】:

  • Red Black Tree 是您要找的。​​span>
  • 使用红黑树可以在树上有按值排序的元素吗?添加或删除时旋转结构会导致树无序。我需要在根节点有最大的元素,并且逐级节点小于或等于其父节点。

标签: algorithm binary-tree


【解决方案1】:

您可能想要实现二进制堆,请参阅http://en.wikipedia.org/wiki/Binary_heap

IIRC 这种数据结构的主要优点之一是它可以嵌入到数组中(因为平衡的性质)。 Heapsort 使用这种数据结构进行就地排序。

【讨论】:

  • 是的,这是真的,目的是设计类似二进制堆的东西。但是,我必须使用答案中提供的类节点,而不是用于存储节点的数组。
  • 抱歉让您感到困惑。链接的 Wikipedia 文章描述了树形式的算法,请参阅“插入”和“删除”部分。嵌入数组只是一种优化,这里不相关(但它有助于这个数据结构的重要性)。
猜你喜欢
  • 2011-12-20
  • 2011-03-19
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多