二项式堆插入java
我在插入二项式堆时遇到问题,当我调用insert 1时,它会打印(1),然后我插入2,它会显示(2),而不是(1(2)),然后三个它会显示(3),而不是(3)(1(2))。如果有人能帮我解决问题,我将不胜感激。先谢谢你。这是我的密码二项式堆插入java,java,Java,我在插入二项式堆时遇到问题,当我调用insert 1时,它会打印(1),然后我插入2,它会显示(2),而不是(1(2)),然后三个它会显示(3),而不是(3)(1(2))。如果有人能帮我解决问题,我将不胜感激。先谢谢你。这是我的密码 public class BHeap { int key; int degree;//The degree(Number of children) BHeap parent, leftmostChild, rightmostChild, r
public class BHeap {
int key;
int degree;//The degree(Number of children)
BHeap parent, leftmostChild, rightmostChild, rightSibling,root,previous,next;
public BHeap(){
key =0;
degree=0;
parent =null;
leftmostChild=null;
rightmostChild=null;
rightSibling=null;
root=null;
previous=null;
next=null;
}
public BHeap merge(BHeap y){
BHeap newHeap = new BHeap();
BHeap currentHeap = y;
BHeap nextHeap = y.rightSibling;
while(currentHeap.rightSibling !=null){
if(currentHeap.degree==nextHeap.degree){
if(currentHeap.key<nextHeap.key){
if(currentHeap.degree ==0){
currentHeap.leftmostChild=nextHeap;
currentHeap.rightmostChild=nextHeap;
currentHeap.rightSibling=nextHeap.rightSibling;
nextHeap.rightSibling=null;
nextHeap.parent=currentHeap;
currentHeap.degree++;
}
else{
newHeap = currentHeap;
newHeap.rightmostChild.rightSibling=nextHeap;
newHeap.rightmostChild=nextHeap;
nextHeap.parent=newHeap;
newHeap.degree++;
nextHeap.rightSibling=null;
nextHeap=newHeap.rightSibling;
}
}
else{
if(currentHeap.degree==0){
nextHeap.rightmostChild=currentHeap;
nextHeap.rightmostChild.root = nextHeap.rightmostChild;//add
nextHeap.leftmostChild=currentHeap;
nextHeap.leftmostChild.root = nextHeap.leftmostChild;//add
currentHeap.parent=nextHeap;
currentHeap.rightSibling=null;
currentHeap.root=currentHeap;//add
nextHeap.degree++;
}
else{
newHeap=nextHeap;
newHeap.rightmostChild.rightSibling=currentHeap;
newHeap.rightmostChild=currentHeap;
currentHeap.parent= newHeap;
newHeap.degree++;
currentHeap=newHeap.rightSibling;
currentHeap.rightSibling=null;
}
}
}
else{
currentHeap=currentHeap.rightSibling;
nextHeap=nextHeap.rightSibling;
}
}
return y;
}
public void Insert(int x){
BHeap newHeap= new BHeap();
newHeap.key=x;
if(this.root==null){
this.root=newHeap;
}
else{
this.root = merge(newHeap);
}
}
public void Display(){
System.out.print("(");
System.out.print(this.root.key);
if(this.leftmostChild != null){
this.leftmostChild.Display();
}
System.out.print(")");
if(this.rightSibling!=null){
this.rightSibling.Display();
}
}
}
公共级BHeap{
int键;
int degree;//度(子级数)
BHeap父级、leftmostChild、rightmostChild、rightSibling、根、上一个、下一个;
公共BHeap(){
键=0;
度=0;
parent=null;
leftmostChild=null;
rightmostChild=null;
rightSibling=null;
root=null;
previous=null;
next=null;
}
公共BHeap合并(BHeap y){
BHeap newHeap=新BHeap();
BHeap currentHeap=y;
BHeap nextHeap=y.右同胞;
while(currentHeap.rightSibling!=null){
if(currentHeap.degree==nextHeap.degree){
如果(currentHeap.key插入时,您正在创建一个新的BHeap
对象,然后将其传递给merge()
。你的新BHeap
没有右同胞
,因此你跳过整个循环,只返回新的BHeap
。因此新的BHeap
成为整个BHeap
的根
,然后你扔掉以前的东西
更新:我不打算编写伪代码,因为它就在您的代码中
因此,您创建一个新的BHeap
和Insert(1)
。您的Insert
方法创建第二个新的BHeap
,然后检查当前BHeap
的root
。这是空的,因此第二个BHeap
成为root
。这很好
现在您插入(2)
。再次创建另一个BHeap
。这次当前BHeap
的根
不是空的,因此我们称之为merge
传入新的BHeap
。请注意,现在引用了这个新的BHeap
(在merge
内部)正如y
。还要注意的是,除了设置键
字段以使所有其他字段都为空之外,您没有对这个新的BHeap
执行任何操作
在merge
内部,您创建另一个BHeap
对象,并创建另一个引用currentHeap
的引用y
(同样,仅设置了键
字段,因此所有其他字段都为空。)你把y的rightSibling
称为nextHeap
,然后是while
循环。while
循环说,虽然currentHeap
的rightSibling
不是空的,但要做一些事情
但是正如我上面所说的,关于currentHeap
(akay
aka您在Insert
中创建的全新BHeap
)的所有内容都是null。因此跳过整个while
循环,并从merge
返回y
Insert
然后接受来自y
的返回值,并将其设置为当前BHeap
的root
。旧的root
被丢弃,坐在角落里痛苦地哭泣,直到垃圾收集器出现并将其拖进早期坟墓。新的root
被丢弃埃斯凯旋,统治至高无上,BHeap的国王(也是BHeap
的唯一成员)……直到您调用Insert(3)
你呢?你可以学习如何使用调试器。在你的方法merge
中,你传递一个BHeap
对象y
。你可以更改任何东西,因为你在insert
方法中创建并传递给merge
的对象没有添加任何同级。while循环永远不会运行
另外,我想你可能想回顾一下你的merge
方法。你似乎从来没有考虑过你正在合并的当前BHeap
,只是重新格式化了给定的BHeap
参数。你有没有尝试过调试它?@Cruncher是的,我调试过,一切都指向了它的位置指向并设置所有内容correctly@Rod如果没有代码,您的问题就没有永久性的价值。如果您不想显示,请删除整个问题。@EJP我很困惑,我的代码就在那里……我没有删除我的代码,我现在正在查看它。您可以为您的答案编写Psuedo代码来帮助我理解您的答案吗你是说更清楚?