Vous cherchez un algorithme rapide pour trouver la distance entre deux nœuds dans un arbre binaire
Comment puis-je trouver la distance entre deux nœuds dans un arbre binaire? De manière équivalente, quels algorithmes sont là pour trouver l'ancêtre commun le plus récent (le plus petit ancêtre commun) de deux nœuds?
source d'informationauteur cboettig
Vous devez vous connecter pour publier un commentaire.
Trouver l'ancêtre commun est presque certainement la tâche plus facile. C'est une question assez simple: commencer à partir de la racine de l'arbre, et de descendre de l'arbre jusqu'à ce que vous atteindre un nœud où vous devrez descendre à des enfants différents pour arriver à deux nœuds en question. Ce nœud est le parent commun (en supposant que l'arbre contient deux nœuds, bien sûr).
Comme tout le monde ici semble savoir, si vous gardez une note de la distance, chaque nœud est à partir de la racine, puis une fois que vous avez trouvé le plus bas de l'ancêtre commun des deux nœuds, vous pouvez travailler sur la distance qu'ils sont les uns des autres en temps constant.
Si vous faites un travail à temps linéaire en la taille de l'arbre, il s'avère que vous pouvez ensuite trouver le plus bas de l'ancêtre commun de deux nœuds en temps constant (peu importe la profondeur de l'arbre). Voir http://en.wikipedia.org/wiki/Lowest_common_ancestor
Baruch, Schieber et Uzi Vishkin algorithme pour ancêtre commun le plus bas est tout à fait pratique à utiliser et à programmer.
Faire deux ensembles comprenant des ancêtres de chaque: alors que l'union de ces ensembles est vide, ajoutez la prochaine ancêtre de chaque nœud à la liste appropriée. Une fois qu'il y est un nœud commun, qui est l'ancêtre commun.
Première,
recherche pour la hauteur du premier élément.
Aussi, de retour le chemin pour y parvenir à l'aide d'une liste liée.
Vous pouvez le faire en O(logN). Supposons arbre est équilibré, où la hauteur est logN.
laissez-H1 = hauteur du premier élément.
Puis,
recherche pour le summum du deuxième élément.
Aussi, de retour le chemin pour y parvenir à l'aide d'une liste liée.
Vous pouvez le faire en O(logN).
Laissez-H2 = hauteur du deuxième élément.
Trace à travers les deux sont liés liste recueillie jusqu'à ce que les valeurs ne sont plus égaux (chemins divergent)
Le point avant de s'écarter, appel à la hauteur de ce nœud H3.
Ainsi, le chemin est plus long
H1 + H2 - 2*H3 (puisque vous avez besoin de H1 à aller à H1 et H2 pour aller à H2. Mais vraiment,
vous pouvez retracer à partir de H1 jusqu'à H1-H3. et de passer ensuite à H2 de H3.
C'est donc (H1-H3) + (H2-H3) = H1+H2 -2*H3.
Détails de mise en œuvre doit être simple
Ainsi,
Temps de la Complexité: O(logN)+ O(logN) + O(logN) = O(logN)
L'espace de la Complexité: O(logN) (pour stocker à la fois lié liste de distances)
ici, c'est DP pour la mise en œuvre BT distance. Pas optimal, mais intéressant.
il crée l'arborescence 1er, avec un tableau d'entrée.