-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbst.c
More file actions
130 lines (118 loc) · 2.28 KB
/
Copy pathbst.c
File metadata and controls
130 lines (118 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "bst.h"
void free_nodes(Node *node){
if(!node){
return;
}
free_nodes(node->left);
free_nodes(node->right);
free_set(node->Set);
node->Set = NULL;
free(node);
}
//binary tree with Set in each node
Node * new_node(int value){
Node* node = malloc(sizeof(Node));
if(!node){
return NULL;
}
node->value = value;
node->Set = new_set(16);
node->right = NULL;
node->left = NULL;
return node;
}
Node** find( Node** n, int value )
{
if((*n) == NULL)
{
return n;
}
else if((*n)->value == value)
{
return n;
}
else if(value < (*n)->value)
{
return find(&((*n)->left), value);
}
else
{
return find(&((*n)->right), value);
}
}
int insert_to_tree( Node *head, int value ){
if(head == NULL){
head = new_node(value);
if(!head){
return -1;
}
return 1;
}
if (*find(&head, value) != NULL)
{
return 0;
}
else
{
Node ** n = find(&head, value);
*n = new_node(value);
return 1;
}
}
Node* removerightmost( Node** from )
{
if((*from)->right == NULL)
{
return *from;
}
return removerightmost(&((*from)->right));
}
int remove_from_tree( Node** head, int value )
{
Node **del = find(head, value);
if((*del) == NULL)
{
return 0;
}
if((*del)->left == NULL && (*del)->right == NULL)
{
free_set((*del)->Set);
free(*del);
*del = NULL;
return 1;
}
else if((*del)->left == NULL)
{
Node *temp = *del;
*del = (*del)->right;
free_set(temp->Set);
free(temp);
temp = NULL;
return 1;
}
else if((*del)->right == NULL)
{
Node *temp = *del;
*del = (*del)->left;
free_set(temp->Set);
free(temp);
temp = NULL;
return 1;
}
else
{
Node *right = removerightmost(&((*del)->left));
int v = right -> value;
remove_from_tree(head, v);
(*del)->value = v;
return 1;
}
return 1;
}
void print_tree(Node * head) {
if(head == NULL)
return;
print_tree(head->left);
printf("%d ", head->value);
print_tree(head->right);
}