我如何使用二叉搜索树实现队列?
这样做的方式是,保持将节点插入树中,并同时维护与每个节点相关联的计数值,但在删除二叉搜索树时应该像队列(FIFO)一样工作,因此从具有最低计数值的节点开始从二叉搜索树中删除。
如果我理解问题和解决方案错误,请解释问题。
我如何使用二叉搜索树实现队列?
这样做的方式是,保持将节点插入树中,并同时维护与每个节点相关联的计数值,但在删除二叉搜索树时应该像队列(FIFO)一样工作,因此从具有最低计数值的节点开始从二叉搜索树中删除。
如果我理解问题和解决方案错误,请解释问题。
然而,如果你坚持要使用BST...
你可以将BST用作优先队列,并定义一个包装类型,该类型还包含一个'队列索引',这就是项目排序的方式。你必须定义比较函数以考虑当前队列索引,否则你只能添加等于索引类型最高和最低值之差的项数。
BST // to store data
pointer to head; // Points to the head of the Queue
pointer to tail // Points to the tail of the Queue
struct Node{
int x;
//left pointer
//right pointer
struct Node *next_queune_element;
}
插入节点 当您想要添加一个元素时,首先访问指针尾部指向的节点并将其指向您刚刚插入的新元素(BST节点)。然后,更新尾指针以指向新元素。
删除节点
当您删除一个元素时,首先访问头指针指向的节点,将next_queune_element
存储在辅助临时变量中并删除节点。最后,使头指针指向辅助临时变量。
我认为这里需要使用二叉树而不是二叉搜索树作为所需的数据结构。在进行函数式编程时,使用二叉树实现队列可能会很有用。您可以使用一个二叉树,在每次推入和弹出操作后保持平衡,因此它们将始终是O(log n)。推入和弹出看起来像:
在这两种情况下,重新平衡不会违反插入顺序。两者都很容易实现。实际上,您正在使用具有更改插入函数的AVL树。奖励是元素不需要(完全)可排序。
SortedSet
或类似使用红黑树的数据结构。而PriorityQueue
则使用堆。 - AJMansfieldadd
),删除第一个项目(pop
)和检查第一个项目(top
)。与堆、节点列表或环形缓冲区相比,BST 在这些操作中的性能非常糟糕,绝对不可接受。如果需要快速成员测试(find
)或快速插入(insert
),则使用 BST,而队列不需要。 - AJMansfield