@frilix
Иногда "творю"

Проверить является ли дерево идеально сбалансированным?

Здравствуйте , есть программа реализующая бинарное дерево поиска , нужно проверить является ли дерево идеально сбалансированным . Помогите разобраться хоть с примерным алгоритмом проверки .
/*//////////////////////////////////////////
** Построить бинарное дерево поиска, данными в узлах которого являются целые числа.
** Проверить, является ли полученное дерево идеально сбалансированным.
** Обойти дерево в прямом и симметричном порядке.
**
** Реализация дерева – по выбору студента (выбор обосновать!)
** Все структуры данных оформить в виде классов. Все данные считывать из файлов
*///////////////////////////////////////////
#include <iostream>

using namespace std;

struct Node
{
      int data;
      int height_left, height_right;
      Node * left, * right;
};

typedef struct Node *tree;

struct Node * NewNode (int data)       //создание нового узла
{
     struct Node * pTree = new Node;
     pTree->data = data;
     pTree->height_left = pTree->height_right =  0;
     pTree->left = pTree->right = NULL;
     return pTree;
}

/*
** Добавление данных в  дерево
*/
int AddNode (tree & pTree, int data)  //функция добавления узла в дерево, возвращается 1, если увеличивается высота дерева
{
    /* Если указатель равен нулю */
    if (!pTree)
    {
        pTree = NewNode(data);
        return 1;
    }

    /* Если добавляемый элемент уже существует */
    if (data == pTree->data)
        return 0;

    /* Добавление в левое поддерево */
    if (data < pTree->data)
    {
       if (AddNode(pTree->left,data))
       {
          pTree->height_left++;

          if (pTree->height_left > pTree->height_right)
            return 1;
       }
       return 0;
    }

    /* Добавление в правое поддерево */
    if (AddNode(pTree->right,data))
    {
       pTree->height_right++;

       if (pTree->height_right > pTree->height_left)
        return 1;
    }

    return 0;
}

/*
** Обход  и печать в  симметричном  порядке
*/
void PrintSim(tree pTree)
{
    if (pTree)
    {
        PrintSim(pTree->left);
        cout << pTree->data << '(' << pTree->height_left << '/' << pTree->height_right << ")  ";//значение узла (высота левого поддерева/высота правого поддерева)
        PrintSim(pTree->right);
    }
}

/*
** Обход  и печать в  прямом порядке
*/
void PrintPre(tree pTree)
{
    if (pTree)
    {
        cout << pTree->data << '(' << pTree->height_left << '/' << pTree->height_right << ")  ";//значение узла (высота левого поддерева/высота правого поддерева)
        PrintPre(pTree->left);
        PrintPre(pTree->right);
    }
}

/*
** Удаление дерева
*/
void DelTree(tree pTree)
{
     if (pTree->left)
        DelTree(pTree->left);

     if (pTree->right)
        DelTree(pTree->right);

     delete pTree;
}

int main()
{
    tree pTree = NULL;
    int mas[15]={14, 8, 1, 13, 7, 12, 6, 2, 9, 0, 11, 10, 4, 3, 5}, i;

    for (i = 0; i < 15; i++)
        AddNode(pTree, mas[i]);

    cout << "Обход Дерева в симметричном порядке" << endl;
    PrintSim(pTree);

    cout << endl << "Обход Дерева в прямом порядке" << endl;
    PrintPre(pTree);

    DelTree(pTree);

    return 0;
}
  • Вопрос задан
  • 6816 просмотров
Решения вопроса 2
@kir_vesp
Web Developer
При симметричном обходе, когда доходишь до конца левого поддерева возвращаешь в его родитель глубину(будет 1), потом обходишь правое и возвращаешь его глубину. Возвращаясь на уровень выше, возвращаешь в качестве глубины максимальное значение из левой и правой глубин, в качестве глубины для левого/правого поддерева. Параллельно, проверяешь, если после обхода правого поддерева глубины различаются более чем на 1, то завершаешь алгоритм и говоришь, что дерево не сбалансировано.
Ответ написан
@mamkaololosha
webdocs.cs.ualberta.ca/~holte/T26/balanced-trees.html
Идеально сбалансированное, это когда либо есть оба чайлда, либо нет никакого + root->left и root->right имеют одинаковое число чилдов

или
It is clear that at every level there are twice as many nodes as at the previous level

Нужно определиться с идеальностью. Сказать что проверяете именно такую или сякую или какую-то еще.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы