Найти сбалансированный 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 - это (довольно длинная) функция для графического представления дерева. Код работает без ошибок, однако я получаю пустое дерево. Я был бы признателен за любые комментарии.