我需要为我的算法II类“创建由二叉搜索树(BST)实现的优先级队列”。但是,我不确定如何将二进制搜索树用作优先级队列。有人可以澄清这项任务要求我做什么吗?
作为参考,以下是PriorityQueue必须实现的方法:
add – adds a new item to the queue
peek – returns the head of the queue
remove – removes the head of the queue and returns it
search – returns the position of an element in the queue, or -1 if it is not found.
size – returns the total number of elements in the queue
inorder – returns an in-order, comma-separated string of every element in the queue
preorder – returns an pre-order, comma-separated string of every element in the queue
height – returns the height of the underlying BST
提前感谢您的任何建议!!
答案 0 :(得分:4)
始终订购Binary Search Tree,如果插入新项目,将始终保持秩序。
二叉搜索树优于其他数据结构的主要优点是相关的排序算法和搜索算法(如有序遍历)非常有效。
这就是你的优先级队列。在可能的实施方式中,具有最低优先级的项目将获得最高编号,具有最高优先级的项目将获得最低编号。如果这些项目已插入BST并且您将其读取inorder
,那么您将拥有应该处理队列的顺序。
要处理队列,您将“弹出”树中的第一个元素,其余部分将由BST自动订购。
您唯一需要注意的是将新元素正确插入树中,如果删除第一个元素会发生什么。
您的方法将映射到树操作,add
在正确的位置插入新项并在必要时修改树,size
例如返回树的大小inorder
1}}将遍历树。
希望能让它更清晰一点。
答案 1 :(得分:0)
binary search tree用于按排序顺序有效维护项目。如果排序顺序基于优先级,则二叉树将成为优先级队列。弹出优先级最高的项目,并根据优先级插入新项目。
已编辑添加:
考虑替代方案可能会有所帮助 - 如果你使用链接列表作为你的队列,你怎么知道在哪里插入一个新项目,而不是一直走到列表中,这是O(N)与N的最坏情况。使用二叉树解决了这个问题。
答案 2 :(得分:0)
add peek remove是BST的标准方法
对于搜索,您可以缓存每个节点中的大小,该大小将是节点为其根的子树中的当前元素数(或换句话说node.size = 1+ (node.right==null?0:node.right.size) + (node.left==null?0:node.left.size)
)
然后搜索变为
int search(E el,Node n){
if(n==null)return -1;//stop recursion && nullpointer
int comp = el.compareTo(n.value);
if(comp==0)return n.left==null?0:node.left.size;
else if(comp<0){
return search(el,node.left);
}else{
int res = search(el,node.right)
return res<0?res:res+(n.left==null?0:node.left.size)+1;//pass through -1 unmodified
}
}