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,这是其中删除节点函数,丑的要死,可读性太差。希望可以把代码多分支语句优化。
分支结构有两种情况,该节点有左子树或左右子树都有。
需求是和值较小的子树进行交换。
Il est recommandé de l'écrire sous forme récursive. Je vais le démontrer en utilisant du code de type Python :
La logique de get_min n'est pas très compliquée.
Il est recommandé de lire le code source de PriorityQueue. Il existe deux fonctions : siftUp() et siftDown(). L'une consiste à faire flotter l'élément vers le haut et l'autre à le couler si vous souhaitez en supprimer. nœud, alors vous devez supprimer le dernier nœud. Le nœud est ajouté à la position où l'élément a été supprimé, puis coule et flotte à nouveau
.Ceci a été écrit avec désinvolture lorsque j'examinais la structure des données il y a quelques jours. Cela n'a pas été testé, mais la logique principale est tout à fait correcte
.Parce que la logique métier elle-même est là, il est en fait difficile de réduire
if
les branches. De plus, la logique dans chaque branche n'est pas très compliquée, et elle n'a pas besoin d'être résumée dans une interface. Opinions personnelles, bienvenue. à échanger