我在插入二项式堆时遇到麻烦,当我调用插入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, 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
对象,然后将其传递给merge()
。您的新BHeap
没有rightSibling
,因此您跳过了整个while
循环,只返回了新的BHeap
。因此,新的BHeap
变成整个root
的BHeap
,然后您丢弃之前的内容。
更新:我不会编写伪代码,因为它就在您的代码中。
因此,您将创建一个新的BHeap
和Insert(1)
。您的Insert
方法将创建第二个新的BHeap
,然后检查当前root
的BHeap
。这是空的,因此第二个BHeap
成为root
。没关系。
现在您Insert(2)
。再次,创建另一个BHeap
。这次,当前root
的BHeap
不为null,因此我们将merge
传入新的BHeap
。请注意,此新的BHeap
现在(在merge
内部)称为y
。还要注意,除了设置BHeap
字段之外,您对此新的key
都没有做任何事情,因此所有其他字段均为空。
在merge
内,您可以创建另一个BHeap
对象,并创建另一个引用currentHeap
的引用y
。 (同样,仅设置了key
字段,因此所有其他字段均为空。)将y的rightSibling
称为nextHeap
,然后进入while
循环。 while
循环说,虽然rightSibling
的currentHeap
不为空,但要做很多事情。
但是正如我在上面说的,有关currentHeap
(又称y
或您在BHeap
中创建的全新Insert
)的所有信息都是 null 。因此,将跳过整个while
循环,并从y
返回merge
。
然后Insert
接受y
的返回值,并将其设置为当前root
的BHeap
。旧的root
被丢弃,在角落里因悲惨的命运而痛苦地哭泣,然后垃圾收集器出现并将其拖入早期的坟墓。新的root
欢呼雀跃,并成为BHeap
的王者(也是BHeap
的唯一成员)至高无上的王位...直到您调用Insert(3)
。
和你?您将学习如何使用调试器。
关于java - 二项式堆插入Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19666235/