-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTree.c
134 lines (110 loc) · 4.6 KB
/
Tree.c
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
typedef struct BinaryTree{ //Двоичное дерево
long int number;
struct BinaryTree * left;
struct BinaryTree * right;
} BinaryTree;
BinaryTree * AddTree(BinaryTree * tree, long int num) { //Добавление элемента в дерево
if (tree->number == num) return (NULL); //Если элемент уже есть в дереве
else {
if (tree->number > num)
if (tree->left != NULL)
AddTree(tree->left, num);
else {
tree->left = (BinaryTree * ) malloc (sizeof(BinaryTree));
tree->left->left = NULL;
tree->left->right = NULL;
tree->left->number = num;
return(tree->left);
}
if (tree->number < num)
if (tree->right != NULL)
AddTree(tree->right, num);
else {
tree->right = (BinaryTree * ) malloc (sizeof(BinaryTree));
tree->right->left = NULL;
tree->right->right = NULL;
tree->right->number = num;
return (tree->right);
}
}
}
BinaryTree * FoundTree(BinaryTree * tree, long int num){ //Поиск элемента в дереве
if (tree->number == num)
return (tree); //Возвращаем указатель на узел дерева
else {
if (tree->number > num)
if (tree->left != NULL)
return (FoundTree(tree->left, num));
else
return (NULL);
if (tree->number < num)
if (tree->right != NULL)
return (FoundTree(tree->right, num));
else
return (NULL);
}
}
BinaryTree * Min(BinaryTree * root, BinaryTree * tree){ //Нахождение узла, потомок которого - наименьший в этом поддереве
if (tree->left == NULL)
return root;
return Min(tree, tree->left);
}
BinaryTree * DellTree(BinaryTree * root, BinaryTree * tree){ //Удаление определенного узла корня
if(tree->left == NULL && tree->right == NULL){ //У узла нет потомков
if(root->left == tree) { //Обнуляем указатель в корне
root->left = NULL;
free(tree);
} else {
root->right = NULL;
free(tree);
}
tree = NULL;
return(NULL);
}
if(tree->left != NULL && tree->right == NULL){ //У узла есть только левый потомок
tree->number = tree->left->number;
BinaryTree * temp = tree->left;
if(temp->right != NULL)
tree->right = temp->right;
if(temp->left != NULL)
tree->left = temp->left;
if(temp->left == NULL && temp->right == NULL)
tree->left = NULL;
free(temp);
temp = NULL;
return(NULL);
}
if(tree->left == NULL && tree->right != NULL){ //У узла есть только правый потомок
tree->number = tree->right->number;
BinaryTree * temp = tree->right;
if(temp->right != NULL)
tree->right = temp->right;
if(temp->left != NULL)
tree->left = temp->left;
if(temp->left == NULL && temp->right == NULL)
tree->right = NULL;
free(temp);
temp = NULL;
return(NULL);
}
if(tree->right != NULL && tree->left != NULL){ //У узла есть оба потомка
//На место узла ставится самый левый потомок правого поддерева, или самый правый потомок левого поддерева
//Поставим самый левый потомок правого дерева
BinaryTree * temp = Min(tree, tree->right);
tree->number = temp->left->number;
DellTree(temp, temp->left);
temp = NULL;
}
}
void DellAllTree(BinaryTree * tree){ //Удаление всего дерева
if(tree != NULL){
if(tree->left != NULL) DellAllTree(tree->left);
if(tree->right != NULL) DellAllTree(tree->right);
free(tree);
}
}
void TreePrint(BinaryTree * tree){ //Вывод всех элементов дерева, в префиксной форме
printf(" %li", tree->number);
if(tree->left != NULL) TreePrint(tree->left);
if(tree->right != NULL) TreePrint(tree->right);
}