branche Shortest dans un arbre binaire?

voix
1

Un arbre binaire peut être codé en utilisant deux fonctions let r telle que pour un node n, l(n)donner à l'enfant de gauche n, r(n) donner à l'enfant le droit de n.

Une branche d'un arbre est un chemin à partir de la racine à une feuille, la longueur d'une branche à une feuille particulière est le nombre d'arcs sur le chemin de la racine à cette feuille.

Soit MinBranch(l,r,x)être un simple algorithme récursif pour avoir un arbre binaire codé par les fonctions L et R en même temps que le noeud racine x de l'arbre binaire et renvoie la longueur de la plus courte branche de l'arbre binaire.

Donnez le pseudocode pour cet algorithme.

OK, donc en gros ce que je suis venu avec à ce jour:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Il est évident que ce n'est pas grande ou parfaite. Je serais reconnaissant si les gens peuvent me aider à obtenir ce parfait et travail - toute aide sera appréciée.

Créé 28/08/2009 à 05:07
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
3

Je doute que quelqu'un résoudra les devoirs pour vous straight-up. Un indice: la valeur de retour doit sûrement croître plus que l'arbre devient plus grand, non? Cependant, je ne vois pas de littéraux numériques dans votre fonction, sauf 0, et aucun opérateur d'addition soit. Comment allez-vous revenir toujours plus grand nombre?

Un autre angle sur la même question: quand vous écrivez une fonction récursive, il aide à énumérer « ce sont toutes les conditions où je devrais arrêter de me appeler ce que je reviens dans chaque circonstance? »

Créé 28/08/2009 à 05:15
source utilisateur

voix
2

Vous êtes sur la bonne approche, mais vous n'êtes pas tout à fait; votre algorithme récursif retournera toujours 0. (la logique est presque droite, mais ...)

noter que la longueur des sous-branches est une inférieure à la longueur de la branche; donc left_oneet right_onedevrait être 1 + MinBranch....

Steping par l'algorithme avec quelques arbres échantillons aidera à découvrir des erreurs hors par un comme celui-ci ...

Créé 28/08/2009 à 05:16
source utilisateur

voix
0

Ce que vous avez créé peut être considéré comme une recherche en profondeur d'abord. Cependant, étant donné ce que vous êtes après (branche la plus courte), cela peut ne pas être l'approche la plus efficace. Pensez à la façon dont votre algorithme exécuterait sur un arbre qui était très lourd sur le côté gauche (du nœud racine), mais avait un seul nœud sur le côté droit.

Astuce: envisager une approche de recherche en largeur.

Créé 28/08/2009 à 05:19
source utilisateur

voix
0

Qu'est - ce que vous avez l' air là comme une profondeur premier algorithme de recherche qui devra rechercher l'arbre entier avant de venir à une solution. ce que vous avez besoin est la largeur d' abord la recherche algorithme qui peut revenir dès qu'il trouve la solution sans faire une recherche complète

Créé 28/08/2009 à 05:19
source utilisateur

voix
1

Il semble que vous avez presque, mais considérez cet exemple:

      4

   3     5

Lorsque vous trace à travers MinBranch, vous verrez que dans votre MinBranch(l,r,4)appel:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

Cela a du sens, après tout, 3 est un nœud feuille, donc bien sûr la distance au nœud feuille la plus proche est 0. La même chose se produit pour right_one.

Mais vous le vent alors ici:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

mais c'est manifestement erronée, parce que ce noeud (4) n'est pas un nœud feuille. Votre code a oublié de compter le noeud courant (oups!). Je suis sûr que vous parvenez à résoudre ce problème.


Maintenant, en fait, ils font comme vous ce n'est pas le plus rapide, mais je ne suis pas sûr si cela est pertinent pour cet exercice. Considérez cet arbre:

         4
       3   5
     2
   1

Votre algorithme comptera la branche gauche récursive, même si elle pourrait, hypothétiquement, caution si vous devez d'abord comptiez la branche droite et a noté que 3 a une gauche, il est donc nettement plus long que 5 (ce qui est une feuille). Mais, bien sûr, compter la branche droite premier ne fonctionne pas toujours!

Au lieu de cela, avec le code plus complexe, et probablement un compromis entre d'une plus grande utilisation de la mémoire, vous pouvez vérifier les nœuds de gauche à droite, de haut en bas (comme l'anglais ordre de lecture) et arrêter à la première feuille que vous trouvez.

Créé 28/08/2009 à 05:20
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more