#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; }