Существует страница в http://geeksforgeeks.org/?p=6633 , что обсуждается построение дерева из его предзаказа и заказ обходов. Здесь, так как ваше дерево дерево поиска, вы имеете в своем порядке обхода неявно (используя порядок сортировки ключей). Вы можете использовать рекурсивный алгоритм , как тот , на этом сайте , чтобы вычислить уровень каждого узла дерева (без необходимости строить дерево), а затем добавить уровни вместе , чтобы получить внутреннюю длину пути. Этот алгоритм не может быть наиболее эффективным, так как он делает поиск на обходе , чтобы найти правильный ребенок каждого узла, но он должен работать. Это моя догадка о том , как сделать алгоритм однопроходный (предполагая , что все ключи различны):
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;
}
Начать с:
key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);
где mkбольше , чем наибольший возможный ключ в дереве.