На странице 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
больше, чеммаксимально возможный ключ в вашем дереве.