2026-rff_mp/stepushovgs/data-structures/sorce/main_tree.c
2026-04-30 16:11:36 +03:00

130 lines
2.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}