2010-05-06 5 views
1

LinkEst-ce que ce morceau de code Leftist Tree de Wikipedia est correct?

public Node merge(Node x, Node y) { 
    if(x == null) 
    return y; 
    if(y == null) 
    return x; 

    // if this was a max height biased leftist tree, then the 
    // next line would be: if(x.element < y.element) 
    if(x.element.compareTo(y.element) > 0) { 
    // x.element > y.element 
    Node temp = x; 
    x = y; 
    y = temp; 
    } 

    x.rightChild = merge(x.rightChild, y); 

    if(x.leftChild == null) { 
    // left child doesn't exist, so move right child to the left side 
    x.leftChild = x.rightChild; 
    x.rightChild = null; 
    x.s = 1; 
    } else { 
    // left child does exist, so compare s-values 
    if(x.leftChild.s < x.rightChild.s) { 
     Node temp = x.leftChild; 
     x.leftChild = x.rightChild; 
     x.rightChild = temp; 
    } 
    // since we know the right child has the lower s-value, we can just 
    // add one to its s-value 
    x.s = x.rightChild.s + 1; 
    } 
    return x; 
} 

Ce qui me fait poser cette question est:

if(x.element.compareTo(y.element) > 0) { 
    // x.element > y.element 
    Node temp = x; 
    x = y; 
    y = temp; 
    } 

est-ce pas tout simplement pas le travail va, car les références ne sont commutées à l'intérieur de la méthode?

+0

Eh bien, ce n'est certainement pas * correct *. – David

+0

Arbre de gauche? Je n'avais aucune idée que les structures de données étaient devenues politisées. Il n'y a rien de sûr dans notre société? – duffymo

Répondre

1

Il les commute pour les exécutions ultérieures dans la méthode. Bien que le commutateur ne modifie aucune référence directement en dehors de la méthode, la vérification est effectuée de sorte qu'il n'y ait qu'un seul chemin de logique à travers le code, l'élément évalué le plus petit étant toujours dans le nœud x. travaille avec les éléments corrects.

Pour un exemple spécifique, regardez la ligne de code suivante:

x.rightChild = merge(x.rightChild, y); 

Quel que soit le plus petit des deux (x ou y) fusionneront en dessous, à son enfant à droite, la plus grande les deux. Ainsi, cela permet à la méthode elle-même de s'inquiéter de la commande, et signifie que les deux éléments peuvent être ajoutés dans n'importe quel ordre, et le comportement correct se produira à cause de cela.

Espérons que cela aide.

0

est-ce pas tout simplement pas le travail va, car les références ne sont commutées dans la méthode?

Le reste de la méthode fonctionnera sur les références commutées, ce qui rend le commutateur tout à fait significatif.

Questions connexes