calculer la longueur du trajet interne d'un BST uniquement de précommande ou postorder traversal

voix
3

Bonjour communauté StackOverflow!

Je suis en train de comprendre comment calculer la longueur du chemin interne de BST étant donné que la précommande ou postorder traversal (il ne devrait pas faire beaucoup de différence) sans construire l'arbre; qui est, je veux utiliser un des traversals mentionnés ci-dessus. Cela peut être une simple réponse à la plupart d'entre vous, mais comme vous l'avez déjà pensé que je suis tout à fait nouveau à des arbres.

Eh bien toute pensée est apprécié et merci.

Créé 23/02/2011 à 06:01
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
-1

Si je comprends bien votre problème, il peut ne pas être possible. Considérons les deux arbres

   A         A
  / \        |
 B   C       B
             |
             C

Ceux-ci ont la même précommande traversal (ABC) mais des longueurs différentes de trajet interne (2 et 3).

Créé 23/02/2011 à 06:44
source utilisateur

voix
0

Il y a une page à http://geeksforgeeks.org/?p=6633 qui traite la construction d' un arbre de son pré - commande et en ordre traversals. Ici, depuis votre arbre est un arbre de recherche, vous avez la traversal dans l'ordre implicite ( en utilisant l'ordre de tri des clés). Vous pouvez utiliser un algorithme récursif comme celui sur ce site pour calculer le niveau de chaque nœud de l' arbre (sans avoir besoin de construire l'arbre), puis additionner les niveaux pour obtenir la longueur du chemin interne. Cet algorithme pourrait ne pas être le plus efficace, car il fait des recherches sur le traversal pour trouver l'enfant le droit de chaque nœud, mais il devrait fonctionner. Ceci est ma meilleure estimation sur la façon de faire un algorithme unique passe ( en supposant que toutes les clés sont distinctes):

int internal_path_length(key_iter& cur_node, key_iter end, int level, key max_key) {
  if (cur_node == end) return 0;
  key cur_key = *cur_node;
  if (cur_key > max_key) return 0;
  ++cur_node;
  int len1 = internal_path_length(cur_node, end, level + 1, cur_key);
  int len2 = internal_path_length(cur_node, end, level + 1, max_key);
  return len1 + len2 + level;
}

Commencer avec:

key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);

mkest plus grande que la plus grande clé possible dans votre arbre.

Créé 23/02/2011 à 06:48
source utilisateur

voix
0

Depuis son BST un nous avons implicitement afinde traversal de l'arbre (liste triée des éléments).

Nous pouvons créer un arbre unique à partir juste précommander ou postorder traversal Pre sera [R, la liste des éléments moins de R, la liste des éléments plus alors R] Poste sera [liste des éléments moins alors R, la liste des éléments plus alors R, R]

pseudo-code ressemblera à ceci.

findIPLPreOrder(poArray,startIndex,endIndex, height) {
     if(startIndex==endIndex){
          retrn height;
     }
     m=findIndexOfEndofLeftSubTree(poArray,start,end);
     return findIPLPreOrder(poArray,start+1,m,height + 1) + findIPLPreOrder(poArray,m+1,end,height + 1);     
}

findIndexOfEndofLeftSubTree(poArray,start,end){
  R=poArray[start]
  for(i=start+1;i<=end;i++){
     if(R < poArray[i]){
         return i-1;
       }
  }
}
Créé 23/02/2011 à 06:52
source utilisateur

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