// another helper procedure private void unionNodes(BinomialHeapNode binHeap) { merge(binHeap); BinomialHeapNode prevTemp = null, temp = Nodes, nextTemp = Nodes.sibling; while (nextTemp != null) { if ((temp.degree != nextTemp.degree) || ((nextTemp.sibling != null) && (nextTemp.sibling.degree == temp.degree))) { gen(8, temp, nextTemp); prevTemp = temp; temp = nextTemp; } else { if (temp.key <= nextTemp.key) { gen(9, temp, nextTemp); temp.sibling = nextTemp.sibling; nextTemp.parent = temp; nextTemp.sibling = temp.child; temp.child = nextTemp; temp.degree++; } else { if (prevTemp == null) { gen(10, temp, nextTemp); Nodes = nextTemp; } else { gen(11, temp, nextTemp); prevTemp.sibling = nextTemp; } temp.parent = nextTemp; temp.sibling = nextTemp.child; nextTemp.child = temp; nextTemp.degree++; temp = nextTemp; } } gen(12, temp, nextTemp); nextTemp = temp.sibling; } }
// 5. Extract the node with the minimum key public int extractMin() { if (Nodes == null) return -1; BinomialHeapNode temp = Nodes, prevTemp = null; BinomialHeapNode minNode = Nodes.findMinNode(); while (temp.key != minNode.key) { gen(13, temp, prevTemp); prevTemp = temp; temp = temp.sibling; } if (prevTemp == null) { gen(14, temp, prevTemp); Nodes = temp.sibling; } else { gen(15, temp, prevTemp); prevTemp.sibling = temp.sibling; } temp = temp.child; BinomialHeapNode fakeNode = temp; while (temp != null) { gen(16, temp, prevTemp); temp.parent = null; temp = temp.sibling; } if ((Nodes == null) && (fakeNode == null)) { gen(17, temp, prevTemp); size = 0; } else { if ((Nodes == null) && (fakeNode != null)) { gen(18, Nodes, fakeNode); Nodes = fakeNode.reverse(null); size = Nodes.getSize(); } else { if ((Nodes != null) && (fakeNode == null)) { gen(19, Nodes, fakeNode); size = Nodes.getSize(); } else { gen(20, Nodes, fakeNode); unionNodes(fakeNode.reverse(null)); size = Nodes.getSize(); } } } return minNode.key; }