我将要编写一个合并两棵树的代码,同时删除斐波那契堆中的最小树。
我制作了一个数组,指示根节点的程度,其#index为D(n)<= log n / log 1.618,其中n是堆中的#nodes。
对于所有根节点,如果不存在具有相同degree(array[degree] != null)
的节点,则将该节点放入数组中,否则执行合并。
但是,在用array[degree]
和节点执行合并之后,如果没有实际使array[degree]
引用的节点为null(解引用数组),我将找不到使array[degree]
为null的方法。 [学位])。
// find D(n), create table
double d_n = (double)n;
int D = (int)(Math.log(d_n)/Math.log(1.618));
Node[] table = new Node[D];
// consolidation
root = minroot;
do {
boolean unique = false;
while (!unique) {
if (table[root.deg] == null) {
table[root.deg] = root;
unique = true;
} else {
if (table[root.deg].key > root.key) {
table[root.deg].prev.next = table[root.deg].next;
table[root.deg].next.prev = table[root.deg].prev;
table[root.deg].parent = root;
table[root.deg].next = root.child.next;
table[root.deg].prev = root.child;
root.child.next.prev = table[root.deg];
root.child.next = table[root.deg];
root.deg++;
} else {...}
}
root = root.next;
}
} while (root == minroot); // incomplete code