From 0233e876c40c5e9f1ecebaa9357851df35c176ea Mon Sep 17 00:00:00 2001 From: inex Date: Thu, 21 May 2020 05:59:52 +0300 Subject: [PATCH] Task 5, closes #5 --- task5/task5.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 task5/task5.c diff --git a/task5/task5.c b/task5/task5.c new file mode 100644 index 0000000..0a85385 --- /dev/null +++ b/task5/task5.c @@ -0,0 +1,152 @@ +#include +#include +#include + +typedef struct bstree { + int key; + char *value; + + struct bstree *left; + struct bstree *right; +} TREE_NODE; + +TREE_NODE *tree_create(int key, char *value) { + TREE_NODE *node; + node = malloc(sizeof(TREE_NODE)); + if (node == NULL) { + fprintf(stderr, "Error allocating node"); + return NULL; + } + node->key = key; + node->value = value; + node->left = NULL; + node->right = NULL; + return node; +} + +void add_leaf(int key, char *value, TREE_NODE *tree) { + TREE_NODE *node; + node = tree_create(key, value); + if (tree == NULL) { + return; + } + + while (tree != NULL) { + if (key < tree->key) { + if (tree->left == NULL) { + tree->left = node; + return; + } else { + tree = tree->left; + } + } else if (key > tree->key) { + if (tree->right == NULL) { + tree->right = node; + return; + } else { + tree = tree->right; + } + } else + return; + } +} + +TREE_NODE *tree_lookup(TREE_NODE *tree, int key) { + while (tree != NULL) { + if (key == tree->key) { + return tree; + } else if (key < tree->key) { + tree = tree->left; + } else { + tree = tree->right; + } + } + return tree; +} + +TREE_NODE *parent_lookup(TREE_NODE *tree, int key) { + while (tree != NULL) { + if ((tree->left != NULL && (key == (tree->left)->key)) || + (tree->right != NULL && (key == (tree->right)->key))) { + return tree; + } else if (key < tree->key) { + tree = tree->left; + } else { + tree = tree->right; + } + } + return tree; +} + +void delete_node(TREE_NODE *tree, int key) { + + TREE_NODE *node = tree_lookup(tree, key); + tree = parent_lookup(tree, key); + + if (node->left == NULL && node->right == NULL) { + if (tree->left == node) { + free(node); + tree->left = NULL; + } else { + free(node); + tree->right = NULL; + } + } else if (node->left != NULL && node->right == NULL) { + if (tree->left == node) { + tree->left = node->left; + free(node); + } else { + tree->right = node->left; + free(node); + } + } else if (node->left == NULL && node->right != NULL) { + if (tree->left == node) { + tree->left = node->right; + free(node); + } else { + tree->right = node->right; + free(node); + } + } else { + if ((node->right)->left == NULL) { + tree = node->right; + node->key = tree->key; + node->value = tree->value; + node->right = tree->right; + free(tree); + } else { + tree = node; + while (tree->left != NULL) { + tree = tree->left; + } + node->key = tree->key; + node->value = tree->value; + free(tree); + } + } + return; +} + +int main(int argc, char const *argv[]) { + TREE_NODE *tree; + tree = tree_create(180, "First"); + add_leaf(50, "second", tree); + add_leaf(250, "third", tree); + add_leaf(40, "fourth", tree); + add_leaf(30, "fifth", tree); + add_leaf(45, "sixth", tree); + add_leaf(44, "seventh", tree); + delete_node(tree, 45); + return 0; +} +/* + 180 + / \ + 50 250 + / + 40 + / \ + 30 45 + / + 44 +*/