Tam je stránka na http://geeksforgeeks.org/?p=6633 nichž se hovoří v budování stromu ze svého předobjednávku a in-pořadí traversals. Tady, protože váš strom je vyhledávací strom, máte in-pořadí Traversal implicitně (pomocí pořadí řazení klíčů). Můžete použít rekurzivní algoritmus, jako je ta na tomto místě pro výpočet úrovně každého uzlu stromu (aniž by bylo nutné stavět strom), přidejte úroveň dohromady, aby vnitřní délku cesty. Že algoritmus nemusí být nejúčinnější, protože to dělá vyhledávání na průchod najít tu správnou dítě každého uzlu, ale to by mělo fungovat. To je můj nejlepší odhad, jak to udělat algoritmus single-pass (za předpokladu, že všechna tlačítka jsou odlišné):
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;
}
Začít s:
key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);
kde mkje větší než největší možný klíč ve vašem stromě.