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.