Подскажите пожалуйста алгоритм проверки сбалансированности бинарного дерева.
Есть простое бинарное деревоЕсть простое бинарное дерево
struct Node // узел бинарного списка
{
Node* Parent; // указатель на родителя
Node* Left; // указатель на лево
Node* Right; // указатель на право
void* Data; // данные
кто то советовал *проходим от корня к листьям, считаем длину пути до каждого листа. если максимальная разбежка в высотах = 1 то дерево сбалансирован*
получается, можно найти самую короткую ветку и самую длинную, потом их сравнить и если разница > 1 то дерево не сбалансировано.
так??
@темы:
Вопрос,
C++,
Алгоритм
Листья - 1, 4, 6, 9. Их длины отличаются лишь на единицу.
Но это не сбалансированное дерево.
как можно реализовать?
Вот я и о том же.
А предложенный вариант с длинами какой-то странный.
функция обхода уже есть
void Node::Scan_Nisxod(void (*f)(void* n))
{
f(this->Data);
std::cout<Left != NULL) this->Left->Scan_Nisxod(f);
if (this->Right != NULL) this->Right->Scan_Nisxod(f);
}
У тебя есть вершина и два поддерева. Тебе для каждой вершины нужно решить три вопроса:
- является ли правое поддерево АВЛ деревом?
- является ли левое поддерево АВЛ деревом?
- разница длин правого и левого поддеревьев различается не больше чем на единицу?
Вот тебе и алгоритм. Переходишь в вершину, запускаешь алгоритм для обоих потомков, вычисляешь высоту поддеревьев, сравниваешь.
Если все ок - то возвращаешь ок.
нашел тут ru.wikipedia.org/wiki/B-%D0%B4%D0%B5%D1%80%D0%B...
Сбалансированность означает, что длина пути от корня дерева к любому его листу одна и та же.
следовательно предложенный способ верен!!??
По идее оно такое.