Interne Pfadlänge eines BST berechnet nur aus vorbestellen oder Nachordnungsdurchquerung

stimmen
3

Hallo Stackoverflow-Community!

Ich versuche, herauszufinden, wie die interne Pfadlänge von BST nur die Preorder oder Nachordnungsdurchquerung gegeben berechnen (es soll nicht viel Unterschied machen), ohne den Baum zu konstruieren; das heißt, ich will nur eine von Traversierungen oben erwähnt verwenden. Dies kann eine einfache Antwort auf die meisten von Ihnen, aber wie du schon gedacht haben, könnte ich bin ganz neu bei Bäumen.

Nun jeder Gedanke wird geschätzt und Dank.

Veröffentlicht am 23/02/2011 um 06:01
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
-1

Wenn ich Ihr Problem verstehen kann es nicht möglich sein. Betrachten wir die beiden Bäume

   A         A
  / \        |
 B   C       B
             |
             C

Diese haben die gleiche Vorordnungsdurchquerung (ABC), aber unterschiedliche interne Weglängen (2 und 3).

Beantwortet am 23/02/2011 um 06:44
quelle vom benutzer

stimmen
0

Es gibt eine Seite an http://geeksforgeeks.org/?p=6633 , die einen Baum von seinem Preorder bespricht den Aufbau und in Ordnung Querungen. Da hier Ihr Baum ein Suchbaum ist, haben Sie die in Ordnung Traversal implizit (unter Verwendung der Sortierreihenfolge der Tasten). Sie können an dieser Stelle einen rekursiven Algorithmus wie das verwenden , um die Ebene des einzelnen Baumknoten zu berechnen (ohne den Baum zu bauen), dann die Ebene hinzufügen , zusammen , um die interne Pfadlänge zu erhalten. Dieser Algorithmus könnte nicht die effizienteste sein, da es tut Suchen auf dem Traversal das richtige Kind von jedem Knoten zu finden, aber es sollte funktionieren. Das ist meine beste Vermutung darüber , wie ein Single-Pass - Algorithmus zu tun (vorausgesetzt , alle Tasten sind verschieden):

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;
}

Beginnen mit:

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

wo mkist größer als der größtmögliche Schlüssel in Ihrem Baum.

Beantwortet am 23/02/2011 um 06:48
quelle vom benutzer

stimmen
0

Seit seiner BST haben haben wir implizit Inorder Traversal des Baumes (sortierte Liste der Elemente).

Wir können einen einzigartigen Baum erstellen von nur vorbestellen oder Nachordnungsdurchquerung Pre wird [R, Liste der Elemente weniger als R, Liste der Elemente größer als R] Beitrag wird [Liste der Elemente weniger als R, Liste der Elemente größer als R, R]

Pseudo-Code wird wie folgt aussehen.

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;
       }
  }
}
Beantwortet am 23/02/2011 um 06:52
quelle vom benutzer

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