Идеально сбалансированные деревья - EcsFlash/DataTypes GitHub Wiki
Исходный код - тут
Как построить идеально сбалансированное дерево?
- взять одну вершину в качестве корня.
- построить левое поддерево с nl = n DIV 2 вершинами тем же способом.
- построить правое поддерево с nr = n-nl-1 вершинами тем же способом.
void createBalancedTree(Node*& node, int n, ifstream& f)
{
if (n > 0)
{
int elem;
f >> elem;
node = new Node(elem);
createBalancedTree(node->left, n / 2, f);
createBalancedTree(node->right, n - (n/2) - 1, f);
}
}
Идеально сбалансированные деревья изобретены для сокращения времени работы вычислительных алгоритмов, связанных с необходимостью частого прохода по ветвям дерева (напомним, что ветвь - это путь от корня дерева до листа). Одним из примеров подобного рода алгоритмов является поиск информации в дереве. Для поиска придется перебрать не более log2n вершин, где n - число вершин в дереве. Одно "но": при формировании идеально сбалансированного дерева ключи необходимо вводить в отсортированном по возрастанию (по убыванию) виде.
Поэтому второй способ построения идеально сбалансированного дерева - через отсортированный по возрастанию массив, начиная выстраивать дерево с центрального элемента.