update bin tree
This commit is contained in:
parent
10f35b3ac3
commit
b638d6c169
129
stepushovgs/data-structures/sorce/main_tree.c
Normal file
129
stepushovgs/data-structures/sorce/main_tree.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
#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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user