public void delete(int pos) {
Heap[pos] = Heap[size];
size--;
int current = pos;
while (hasLeaf(current)) {
if (hasDoubleLeaf(current)
&& Heap[current] > Math.min(Heap[leftChild(current)],
Heap[rightChild(current)])) {
if (Heap[leftChild(current)] < Heap[rightChild(current)]) {
swap(leftChild(current), current);
current = leftChild(current);
} else {
swap(rightChild(current), current);
current = rightChild(current);
}
} else if (Heap[current] > Heap[leftChild(current)]) {
swap(current, leftChild(current));
current = leftChild(current);
} else{
break;
}
}
}
写了一个最小heap,这是其中删除节点函数,丑的要死,可读性太差。希望可以把代码多分支语句优化。
分支结构有两种情况,该节点有左子树或左右子树都有。
需求是和值较小的子树进行交换。
Adalah disyorkan untuk menulisnya dalam bentuk rekursif saya akan menunjukkannya menggunakan kod seperti Python:
Logik get_min tidak begitu rumit.
Adalah disyorkan untuk membaca kod sumber PriorityQueue Terdapat dua fungsi: siftUp() dan siftDown(). nod, maka anda perlu memadamkan nod terakhir. Nod ditambahkan pada kedudukan di mana elemen telah dipadamkan, kemudian tenggelam dan terapung semula
Ini ditulis secara santai semasa saya menyemak struktur data beberapa hari yang lalu Ia belum diuji, tetapi logik utamanya agak betulOleh kerana logik perniagaan itu sendiri ada, ia sebenarnya sangat sukar untuk mengurangkan
if
cawangan Selain itu, logik di setiap cawangan tidak begitu rumit, dan ia tidak perlu disarikan ke dalam antara muka , dialu-alukan untuk bertukar