//дерево в массив
void TreeToArray(TreeNode *treeNode, int **mas, int *n)
{
int *mas2 = *mas, n2 = *n; //указатель на массив и количество
if(treeNode)
{
if (treeNode->leaf2)
{
TreeToArray(treeNode->leaf2, &mas2, &n2);
}
//записываем в массив
if (!mas2)
{
n2 = 1;
mas2 = (int *)calloc(1,sizeof(int));
}
else
{
n2++;
mas2 = (int *)realloc(mas2, n2 * sizeof(int));
}
*(mas2 + n2 - 1) = treeNode->inf;
if (treeNode->leaf1)
{
TreeToArray(treeNode->leaf1, &mas2, &n2);
}
}
//возвращаем значения указателя на массив и количество функции-предка
*mas = mas2;
*n = n2;
}
//массив в дерево
void ArrayToTree(int *mas, int n, TreeNode **treeNode)
{
TreeNode *treeNode2 = *treeNode;
if (!n || !mas)
return;
//добавляем средний элемент
add(&treeNode2, *(mas + n/2));
//рекурсивный вызов и передача левой половины массива
ArrayToTree(mas, n/2, &treeNode2);
//правой половины массива
if (n % 2)
{
ArrayToTree(mas + n/2 + 1, n/2, &treeNode2);
}
else
{
ArrayToTree(mas + n/2 + 1, n/2 - 1, &treeNode2);
}
//возвлащаем функции-предку измененное значение указателя на дерево
*treeNode = treeNode2;
}
//балансировка
void Balance(TreeNode *treeNode, TreeNode **newTreeNode)
{
int *mas = NULL;
int n = NULL;
TreeToArray(treeNode, &mas, &n);
ArrayToTree(mas, n, newTreeNode);
}
void main()
{
system("cls");
setlocale(LC_ALL, "rus");
TreeNode *treeRoot = NULL, *treeRoot2 = NULL;
int n = 0; int action;
printf("Введите количество добавляемых узлов ");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
add(&treeRoot, rand()%100);
}
printf("Дерево было создано.\n\n");
see2(treeRoot);
printf("\n\n");
if (balancedTree(treeRoot))
{
printf("Дерево сбалансировано");
}
else
{
printf("Дерево не сбалансировано\n\n");
Balance(treeRoot, &treeRoot2);
see2(treeRoot2);
}
getch();
}