Member 13248256 Ответов: 1

Найти сбалансированный BST с максимальной высотой


Всем привет!

Я пытаюсь найти способ поиска BST для его сбалансированного поддерева с максимальной высотой.

Что я уже пробовал:

До сих пор мне удавалось найти методы, позволяющие проверить высоту дерева и проверить, сбалансировано ли оно. Мне трудно заставить их работать, чтобы найти BST с максимальной высотой.

Согласно подсказке Карстенка, я изменил свой код, чтобы включить указатели:

typedef struct Tree {
    int key;
    struct Tree *left;
    struct Tree *right;
} Tree;

int max(int a, int b)
{
    if (a >= b)
        return a;
    else
        return b;
}

int height(Tree* t)
{
    if (t == NULL)
        return 0;
    return 1 + max(height(t->left), height(t->right));
}

int IsBalanced(Tree *t)
{
    int lheight;
    int rheight;

    if (t == NULL)
        return 1;

    lheight = height(t->left);
    rheight = height(t->right);

    if (abs(lheight-rheight) <= 1 &&
        IsBalanced(t->left) &&
        IsBalanced(t->right))
        return 1;

    return 0;
}


Все вышесказанное, кажется, работает нормально. Однако следующий выстрел по получению максимальной высоты BST не удался:

void MaxBalanced(Tree *t, Tree *maxBal, int *maxBal_height)
{
    int t_height;

    if (t == NULL)
        *maxBal_height += 0;

    if (IsBalanced(t) == 1){
        t_height = height(t);
        if (t_height >= *maxBal_height){
            maxBal = t;
            *maxBal_height = t_height;
        }
    }
    else{
        MaxBalanced(t->left, maxBal, maxBal_height);
        MaxBalanced(t->right, maxBal, maxBal_height);
    }
}

int main()
{
    int i;

    Tree* t = NULL;

    int j[20] = { 993, 591, 2, 4, 395, 97, 446, 38, 279, 587, 28, 50, 265, 502, 114, 493, 808, 716, 897, 987 };

    for (i = 0; i < 20; i++)
        t = InsertBST(t, j[i]);

    DisplayTree(t);

    Tree* maxBal = NULL;
    int maxBal_height = 0;
    MaxBalanced(t, maxBal, &maxBal_height);

    DisplayTree(maxBal);

    return 0;
}


DisplayTree - это (довольно длинная) функция для графического представления дерева. Код работает без ошибок, однако я получаю пустое дерево. Я был бы признателен за любые комментарии.

1 Ответов

Рейтинг:
0

KarstenK

Чтобы получить максимальную высоту, вам нужно где-то сохранить свой фактический максимум и сравнить его с фактическим значением.

И у вас отсутствуют некоторые крайние случаи, такие как последний в MaxBalanced, который отсутствует.

Вам нужен запасной вариант в несбалансированных деревьях.


Member 13248256

Спасибо за подсказку. Я придумал новую версию своего кода, которая передает max во внешнюю переменную.