diff --git a/gen/Trees/appTree b/gen/Trees/appTree new file mode 100755 index 0000000..144063f Binary files /dev/null and b/gen/Trees/appTree differ diff --git a/gen/Trees/func.c b/gen/Trees/func.c new file mode 100644 index 0000000..78293bb --- /dev/null +++ b/gen/Trees/func.c @@ -0,0 +1,127 @@ +#include +#include +#include "head.h" + +tree *init_root(tree *root, int field) // Выделение памяти под корень дереваnode +{ + tree *tmp = malloc(sizeof(tree)); // Присваивание значения ключу + tmp -> field = field;// Присваивание указателю на родителя значения NULL + tmp -> parent = NULL; // Присваивание указателю на левое и правое поддерево значения NULL + tmp -> left = tmp -> right = NULL; + root = tmp; + return root; +} + +tree *add_node(tree *root, int field) +{ + tree *root2 = root, *root3 = NULL; // Выделение памяти под узел дерева + tree *tmp = malloc(sizeof(tree)); // Присваивание значения ключу + tmp -> field = field; + while (root2 != NULL) + { + root3 = root2; + if (field < root2 -> field) + root2 = root2 -> left; + else + root2 = root2 -> right; + } + tmp -> parent = root3; // Присваивание указателю на левое и правое поддерево значения NULL + tmp -> left = NULL; + tmp -> right = NULL; + if (field < root3 -> field) root3 -> left = tmp; + else root3 -> right = tmp; + return root; +} + +tree *find_node(tree * root, int field) // Если дерево пусто или ключ корня равен искомому ключу, то возвращается указатель на корень +{ + if ((root == NULL) || (root -> field == field)) + return root; // Поиск нужного узла + if (field < root -> field) + return find_node(root -> left, field); + else return find_node(root -> right, field); +} + +// Минимальный элемент дерева +tree *minim(tree *root) +{ + tree *lef = root; + while (lef -> left != NULL) + lef = lef -> left; + return lef; +} + +// Максимальный элемент дерева +tree *maxim(tree *root) +{ + tree *rig = root; + while (rig -> right != NULL) + rig = rig -> right; + return rig; +} + +tree *findForDel(tree *root) +{ + tree *p = root, *lef = NULL; // Если есть правое поддерево, то ищем минимальный элемент в этом поддереве + if (p -> right != NULL) + return minim(p -> right); + lef = p -> parent; + while ((lef != NULL) && (p == lef -> right)) + { + p = lef; + lef = lef -> parent; + } + return lef; +} + +tree *del_node(tree *root, int field) +{ +// Поиск удаляемого узла по ключу + tree *p = root, *lef = NULL, *tmp = NULL; + lef = find_node(root, field); +// 1 случай: у узла нет потомков + if ((lef -> left == NULL) && (lef -> right == NULL)) + { + tmp = lef -> parent; + if (lef == tmp -> right) tmp -> right = NULL; + else tmp -> left = NULL; + free(lef); + } +// 2 случай: потомок один - поддерево справа + if ((lef -> left == NULL) && (lef -> right != NULL)) + { + tmp = lef -> parent; + if (lef == tmp -> right) tmp -> right = lef -> right; + else tmp -> left = lef -> right; + free(lef); + } +// 2 случай: потомок один - поддерево слева + if ((lef -> left != NULL) && (lef -> right == NULL)) + { + tmp = lef -> parent; + if (lef == tmp -> right) tmp -> right = lef -> left; + else tmp -> left = lef -> left; + free(lef); + } +// 3 случай: оба потомка + if ((lef -> left != NULL) && (lef -> right != NULL)) + { + tmp = findForDel(lef); + lef -> field = tmp -> field; + if (tmp -> right == NULL) + tmp -> parent -> left = NULL; + else tmp -> parent -> left = tmp -> right; + free(tmp); + } + return root; +} + +void print_tree(tree *root) +{ + if (root == NULL) + return; + if (root -> field) + printf("%d ", root -> field); + print_tree(root -> left); + print_tree(root -> right); +} \ No newline at end of file diff --git a/gen/Trees/head.h b/gen/Trees/head.h new file mode 100644 index 0000000..53eff76 --- /dev/null +++ b/gen/Trees/head.h @@ -0,0 +1,15 @@ +typedef struct tnode { + int field; + struct tnode *left; + struct tnode *right; + struct tnode *parent; +} tree; + +tree *init_root(tree *root, int field); +tree *add_node(tree *root, int field); +tree *find_node(tree * root, int field); +tree *minim(tree *root); +tree *maxim(tree *root); +tree *findForDel(tree *root); +tree *del_node(tree *root, int field); +void print_tree(tree *root); \ No newline at end of file diff --git a/gen/Trees/main.c b/gen/Trees/main.c new file mode 100644 index 0000000..6cbd9b8 --- /dev/null +++ b/gen/Trees/main.c @@ -0,0 +1,7 @@ +#include +#include +#include "head.h" + +int main(){ + return 126; +} \ No newline at end of file diff --git a/gen/Trees/output/main b/gen/Trees/output/main new file mode 100755 index 0000000..083d9ab Binary files /dev/null and b/gen/Trees/output/main differ