二项式堆插入java

二项式堆插入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

我在插入二项式堆时遇到问题,当我调用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, 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
(aka
y
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代码来帮助我理解您的答案吗你是说更清楚?