From b638d6c169ae6b144261ede7b27b46c7af691ee2 Mon Sep 17 00:00:00 2001 From: GordStep Date: Thu, 30 Apr 2026 16:11:36 +0300 Subject: [PATCH] update bin tree --- stepushovgs/data-structures/sorce/main_tree.c | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 stepushovgs/data-structures/sorce/main_tree.c diff --git a/stepushovgs/data-structures/sorce/main_tree.c b/stepushovgs/data-structures/sorce/main_tree.c new file mode 100644 index 0000000..9890883 --- /dev/null +++ b/stepushovgs/data-structures/sorce/main_tree.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include "linked_list.h" + +/* +3. Двоичное дерево поиска +Узел — словарь: `{'name': 'Имя', 'phone': '123', 'left': None, 'right': None}.` + +Функции: + +def bst_insert(root, name, phone) — рекурсивно или итеративно вставляет, возвращает новый корень (если корень меняется). + +def bst_find(root, name) — поиск. + +def bst_delete(root, name) — удаление, возвращает новый корень. + +def bst_list_all(root) — центрированный обход (рекурсивно собирает записи в отсортированном порядке). +*/ + +typedef struct bst_node +{ + char name[NAME_BUFF_SIZE]; + char phone[PHONE_BUFF_SIZE]; + + struct bst_node* right; + struct bst_node* left; +}bst_node; + +bst_node* create_bst_node(char name[NAME_BUFF_SIZE], char phone[PHONE_BUFF_SIZE]) +{ + bst_node* node = (bst_node*)malloc(sizeof(bst_node)); + + strcpy(node->name, name); + strcpy(node->phone, phone); + + node->left = NULL; + node->right = NULL; + + return node; +} + +void print_bst(bst_node node) +{ + printf("name: %s phone: %s\n", node.name, node.phone); +} + +void bst_inorder_traversal(bst_node* HEAD) +{ + if (HEAD != NULL) + { + bst_inorder_traversal(HEAD->left); + print_bst(*HEAD); + bst_inorder_traversal(HEAD->right); + } +} + +bst_node* bst_search(bst_node* HEAD, char target_name[NAME_BUFF_SIZE]) +{ + /* + Node search(x : Node, k : T): + if x == null or k == x.key + return x + if k < x.key + return search(x.left, k) + else + return search(x.right, k) + */ + + if ((HEAD == NULL) || (strcmp(HEAD->name, target_name) == 0)) + { + return HEAD; + } + if (strcmp(HEAD->name, target_name) > 0) + { + return bst_search(HEAD->left, target_name); + } + else + { + return bst_search(HEAD->right, target_name); + } +} + +bst_node* bst_insert(bst_node* HEAD, char name[NAME_BUFF_SIZE], char phone[PHONE_BUFF_SIZE]) +{ + /* + Node insert(x : Node, z : T): // x — корень поддерева, z — вставляемый ключ + if x == null + return Node(z) // подвесим Node с key = z + else if z < x.key + x.left = insert(x.left, z) + else if z > x.key + x.right = insert(x.right, z) + return x + */ + + if (HEAD == NULL) + { + return create_bst_node(name, phone); + } + else if (strcmp(HEAD->name, name) > 0) + { + HEAD->left = bst_insert(HEAD->left, name, phone); + } + else if (strcpy(HEAD->name, name) < 0) + { + HEAD->right = bst_insert(HEAD->right, name, phone); + } + return HEAD; +} + +int main() +{ + printf("hello world!\n"); + + //bst_node* head = create_bst_node("name", "phone"); + bst_node* head = NULL; + char name[] = "name0"; + + head = bst_insert(head, name, "phone"); + + print_bst(*head); + head = bst_insert(head, "name1", "phone1"); + head = bst_insert(head, "name2", "phone2"); + head = bst_insert(head, "name3", "phone3"); + + bst_inorder_traversal(head); + return 0; +}