使用BST实现队列

时间:2012-11-18 21:01:01

标签: c++ c binary-search-tree

如何使用BST实现队列。

这是这样做的方法,继续在树中插入节点,同时保持与每个节点关联的计数值,但是删除BST应该像队列(FIFO)一样工作,所以开始从节点BST中删除在树中具有最低计数值。

我有问题和解决方案吗?如果没有,请解释我的问题。

3 个答案:

答案 0 :(得分:3)

BST实际上是用于支持队列的不合适的数据结构。你真的应该使用一个链表,因为它会更快,更简单,更简单。

但是,如果你坚持使用BST ......

您可以将BST用作优先级队列,并定义一个包含“队列索引”的包装类型,这是项目的排序方式。您必须定义比较以考虑当前队列索引,因为否则您只能添加与索引类型的最高值和最低值之间的差异一样多的项目。

答案 1 :(得分:1)

您可以拥有这样的队列:

BST // to store data
pointer to head; // Points to the head of the Queue
pointer to tail  // Points to the tail of the Queue

您向BST的节点结构添加指向另一个节点的指针,该节点将表示插入顺序。

struct Node{
  int x;
  //left pointer
  //right pointer
  struct Node *next_queune_element;
}

插入期间 如果要添加元素,首先要访问指针尾指向的节点,并使其指向刚刚插入的新元素(BST节点)。然后更新尾指针以指向新元素。

删除期间 删除元素时,首先访问头指针指向的节点,将next_queune_element存储在辅助临时变量中并删除该节点。最后,使头指针指向辅助临时变量。

答案 2 :(得分:0)

我认为二进制树将是这里所需的数据结构,而不是二进制 search 树。在进行功能编程时,使用二叉树来实现队列可能会很有用。您可以使用二叉树来完成此操作,该树在每次按下和弹出操作之后保持高度平衡,因此它们始终为 O (log n )。推送和弹出看起来像:

  • 在树的最左侧插入元素的函数(push函数);
  • 从树的最右边删除元素的功能(弹出功能)。

在两种情况下,重新平衡都不会违反插入顺序。两者也很容易实现。实际上,您正在使用具有更改的插入功能的AVL树。奖励是元素不需要(完全)可排序。