Task 5, closes #5
This commit is contained in:
parent
9a9e9b28f7
commit
0233e876c4
152
task5/task5.c
Normal file
152
task5/task5.c
Normal file
|
@ -0,0 +1,152 @@
|
|||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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
|
||||
*/
|
Loading…
Reference in a new issue