дерево массив void TreeToArray TreeNode treeNode int mas int int mas2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//дерево в массив
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();
}