Java 如何使用显式链接(使用三重链接的数据结构)实现优先级队列?

Java 如何使用显式链接(使用三重链接的数据结构)实现优先级队列?,java,algorithm,binary-tree,binary-search-tree,priority-queue,Java,Algorithm,Binary Tree,Binary Search Tree,Priority Queue,我正在尝试使用三重链接的数据结构实现优先级队列。我想了解如何实现sink-and-swim操作,因为在使用数组时,只需计算该数组的索引即可。这在使用三重链接的DS时没有意义 另外,我想了解如何正确地在正确的位置插入内容,因为当您使用数组时,您只需在末尾插入内容,然后执行一个swim操作,将所有内容都放在正确的位置,我如何准确地计算链接DS中的“end” 另一个问题是删除优先级最高的元素。为此,对于数组实现,我们只需将最后一个元素与第一个(根)元素交换,然后在删除最后一个元素后,将第一个元素下沉

我正在尝试使用三重链接的数据结构实现优先级队列。我想了解如何实现sink-and-swim操作,因为在使用数组时,只需计算该数组的索引即可。这在使用三重链接的DS时没有意义

另外,我想了解如何正确地在正确的位置插入内容,因为当您使用数组时,您只需在末尾插入内容,然后执行一个swim操作,将所有内容都放在正确的位置,我如何准确地计算链接DS中的“end”

另一个问题是删除优先级最高的元素。为此,对于数组实现,我们只需将最后一个元素与第一个(根)元素交换,然后在删除最后一个元素后,将第一个元素下沉


(这是Sedgewick的任务)。

我发布了这篇文章,以防有人在Sedgewick做这个练习时遇到困难,因为他没有提供解决方案

我已经为最大优先级队列编写了一个实现,它可以根据任何优先级进行修改

我要做的是给二叉树的每个子树分配一个大小,它可以递归地定义为大小(x.left)+大小(x.right)+1。我这样做能够找到最后插入的节点,能够以正确的顺序插入和删除最大值

sink()的工作原理: 与使用数组实现中的相同。我们只是比较x.left和x.right,看看哪个更大,然后交换x和max(x.left,x.right)中的数据,向下移动,直到碰到一个节点,其数据为0){ swapNodeData(x,x.parent); 游泳(x.parent); } } 专用void接收器(节点x){ 如果(x==null)返回; 节点交换节点; if(x.left==null&&x.right==null){ 返回; } else if(x.left==null){ swapNode=x.右; int cmp=x.data.compareTo(swapNode.data); if(cmp<0) swapNodeData(swapNode,x); }else if(x.right==null){ swapNode=x.左; int cmp=x.data.compareTo(swapNode.data); if(cmp<0) swapNodeData(swapNode,x); }否则{ int cmp=x.left.data.compareTo(x.right.data); 如果(cmp>=0){ swapNode=x.左; }否则{ swapNode=x.右; } int cmpParChild=x.data.compareTo(swapNode.data); if(cmpParChild<0){ swapNodeData(swapNode,x); 水槽(swapNode); } } } 专用void swapNodeData(节点x、节点y){ 键温度=x.数据; x、 data=y.data; y、 数据=温度; } 专用节点插入(节点x,密钥数据){ 如果(x==null){ lastInserted=新节点(数据,1); 最后插入的返回; } //比较左右尺寸,看看要去哪里 int leftSize=大小(x.left); int rightSize=大小(x.right);
if(leftSize)您没有解释什么是“三重链接数据结构”@MBo请看我的代码。1个节点有3个链接,1个链接到父节点,2个链接到子节点。