我在插入二项式堆时遇到问题,当我调用插入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();
}
}
}
答案 0 :(得分:1)
当您插入时,您正在创建一个新的BHeap
对象,然后将其传递给merge()
。您的新BHeap
没有rightSibling
,因此您跳过整个while
循环,只返回新的BHeap
。因此,新的BHeap
成为整个root
的{{1}},你就会丢掉以前的内容。
更新:我不打算编写伪代码,因为它就在你的代码中。
所以你制作了一个新的BHeap
和BHeap
。您的Insert(1)
方法会生成第二个新Insert
,然后检查当前BHeap
的{{1}}。那是空的,所以第二个root
变为BHeap
。没关系。
现在你BHeap
。再次,创建另一个root
。这次当前Insert(2)
的{{1}}不为空,因此我们调用BHeap
传递新的root
。请注意,这个新的BHeap
现在被引用(在merge
内)为BHeap
。另请注意,除了设置BHeap
字段以外,您没有对此新merge
执行任何操作,因此所有其他字段均为空。
在y
内,你制作了另一个BHeap
对象,并制作另一个引用key
的引用merge
。 (同样,只有BHeap
字段已设置,因此所有其他字段都为空。)您将y的currentHeap
称为y
,然后是key
循环。 rightSibling
循环表示虽然nextHeap
的{{1}}不为空,但请执行一些操作。
但正如我上面所说,关于while
的所有(又名while
又称您在rightSibling
中创建的全新currentHeap
是 null 。因此,系统会跳过整个currentHeap
循环,并从y
返回BHeap
。
Insert
接受来自while
的返回值,并将其设置为当前y
的{{1}}。旧的merge
被丢弃,坐在角落里,在垃圾收集器出现之前,在悲伤的命运中痛苦地哭泣,并把它拖入早期的坟墓。新的Insert
得意洋洋地欢呼并统治至尊,y
的王(以及root
的唯一成员)......直到你打电话给BHeap
。
而你呢?您将学习如何使用调试器。
答案 1 :(得分:1)
在方法merge
中,您传递了BHeap
个对象y
。您确实更改了任何内容,因为您在BHeap
方法中创建并传递给merge
的{{1}}对象不会添加任何兄弟。 while循环永远不会运行。
另外,我们认为您可能希望查看insert
方法。您似乎没有考虑到要合并的当前merge
,只需重新格式化给定的BHeap
参数。