Witam wszystkich Użytkowników!

Próbuję napisać program w C, który w danym drzewie BST znajduje poddrzewo zbalansowane o największej wysokości. Zacząłem od kilku pomocniczych funkcji:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>

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

Tree* InsertBST(Tree* t, int k)
{
    if (t == NULL) {
        Tree* w = (Tree*) malloc(sizeof(Tree));
        w->key = k;
        w->left = NULL;
        w->right = NULL;
        return w;
    }

    if (k <= t->key)
        t->left = InsertBST(t->left, k);
    else
        t->right = InsertBST(t->right, k);

    return t;
}

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

int height(Tree* t)
{
    // gdy drzewo puste
    if (t == NULL)
        return 0;

    /*
    Jeśli drzewo nie jest puste, to jego wysokość =
    max(wysokość prawego poddrzewa, wysokość lewego poddrzewa) + 1
    */
    return 1 + max(height(t->left), height(t->right));
}

// funkcja zwraca TRUE gdy drzewo jest zbalansowane, FALSE wpp
int IsBalanced(Tree *t)
{
    int lheight; // wysokość lewego poddrzewa
    int rheight; // wysokość prawego poddrzewa

    // jeśli drzewo puste zwracamy TRUE
    if (t == NULL)
        return 1;

    // wysokość lewego i prawego poddrzewa
    lheight = height(t->left);
    rheight = height(t->right);

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

    /*
    Jeśli poprzednie warunki nie są spełnione choć raz
    to drzewo nie jest zbalansowane.
    */
    return 0;
}

Te powyższe działają. Mam natomiast problem z zastosowaniem ich w jednej funkcji:

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

    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);
    printf("%d", maxBal_height);
    DisplayTree(maxBal);

    return 0;
}

Kod kompiluje się i uruchamia się bez wyrzucania błędu. Zdaje się też poprawnie wyliczać wysokość maksymalnego zbalansowanego poddrzewa. Problem leży w tym, że zamiast tego poddrzewa w zmiennej maxBal dostaję drzewo puste. Funkcja DisplayTree wyrzuca drzewo na ekran w formie graficznej, jest jednak zdecydowanie za długa, żeby ją tu kopiować. Zdaję sobie sprawę, że to podejście nie jest optymalne, bo np. używam funkcji height() kilka razy na tych samych danych, ale na początek chciałem napisać coś maksymalnie czytelnego, a dopiero później optymalizować. Byłbym wdzięczny za wskazówki, w którym momencie popełniłem błąd.