Skip to content

Commit bc9abec

Browse files
Merge pull request #176 from RichardWeiYang/master
BST and Heap
2 parents 66a90de + 2a095ae commit bc9abec

File tree

2 files changed

+357
-0
lines changed

2 files changed

+357
-0
lines changed

c-cpp/24_binarysearchtree/bst.c

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
#include <time.h>
6+
7+
enum child_dir {
8+
left_child,
9+
right_child,
10+
root,
11+
};
12+
13+
struct node {
14+
unsigned long data;
15+
struct node *left;
16+
struct node *right;
17+
};
18+
19+
struct root {
20+
struct node *r;
21+
};
22+
23+
void dump(struct node *node, int level, enum child_dir dir)
24+
{
25+
if (!node)
26+
return;
27+
28+
dump(node->right, level + 1, right_child);
29+
30+
if (dir == left_child)
31+
printf("%*s\n", level*3, "|");
32+
33+
printf("%*s - %05lu\n", level*3, " ", node->data);
34+
35+
if (dir == right_child)
36+
printf("%*s\n", level*3, "|");
37+
38+
dump(node->left, level + 1, left_child);
39+
}
40+
41+
struct node* find(struct root *root, unsigned long data)
42+
{
43+
struct node* n = root->r;
44+
45+
while (n) {
46+
if (n->data == data)
47+
return n;
48+
if (data < n->data)
49+
n = n->left;
50+
else
51+
n = n->right;
52+
}
53+
54+
return NULL;
55+
}
56+
57+
struct node* new_node(unsigned long data)
58+
{
59+
struct node *n;
60+
61+
n = malloc(sizeof(struct node));
62+
63+
n->data = data;
64+
n->left = n->right = NULL;
65+
return n;
66+
}
67+
68+
void insert(struct root *root, struct node *new)
69+
{
70+
struct node *parent;
71+
72+
if (!root->r) {
73+
root->r = new;
74+
return;
75+
}
76+
77+
parent = root->r;
78+
79+
while (true) {
80+
/* Don't support duplicate data */
81+
if (new->data == parent->data)
82+
break;
83+
84+
if (new->data < parent->data) {
85+
if (!parent->left) {
86+
parent->left = new;
87+
break;
88+
}
89+
parent = parent->left;
90+
} else {
91+
if (!parent->right) {
92+
parent->right = new;
93+
break;
94+
}
95+
parent = parent->right;
96+
}
97+
}
98+
}
99+
100+
struct node* delete(struct root *root, unsigned long data)
101+
{
102+
struct node *n = root->r, **p = &root->r;
103+
struct node *child;
104+
105+
while (n && n->data != data) {
106+
if (data < n->data) {
107+
p = &n->left;
108+
n = n->left;
109+
} else {
110+
p = &n->right;
111+
n = n->right;
112+
}
113+
}
114+
115+
if (!n)
116+
return NULL;
117+
118+
if (n->left && n->right) {
119+
struct node *rn = n->right, **rp = &n->right;
120+
121+
while (rn->left) {
122+
rp = &rn->left;
123+
rn = rn->left;
124+
}
125+
126+
n->data = rn->data;
127+
n = rn;
128+
p = rp;
129+
}
130+
131+
child = n->left ? n->left : n->right;
132+
*p = child;
133+
134+
return NULL;
135+
}
136+
137+
void insert_test()
138+
{
139+
struct root tree;
140+
struct node* n;
141+
142+
tree.r = NULL;
143+
144+
insert(&tree, new_node(9));
145+
146+
insert(&tree, new_node(5));
147+
insert(&tree, new_node(2));
148+
insert(&tree, new_node(8));
149+
150+
insert(&tree, new_node(18));
151+
insert(&tree, new_node(13));
152+
insert(&tree, new_node(21));
153+
insert(&tree, new_node(20));
154+
155+
dump(tree.r, 0, root);
156+
157+
n = find(&tree, 18);
158+
if (n && n->data == 18)
159+
printf("Get 18\n");
160+
161+
}
162+
163+
void delete_test()
164+
{
165+
struct root tree;
166+
struct node* n;
167+
168+
tree.r = NULL;
169+
170+
insert(&tree, new_node(9));
171+
172+
insert(&tree, new_node(5));
173+
insert(&tree, new_node(2));
174+
insert(&tree, new_node(8));
175+
176+
insert(&tree, new_node(18));
177+
insert(&tree, new_node(13));
178+
insert(&tree, new_node(21));
179+
insert(&tree, new_node(20));
180+
181+
dump(tree.r, 0, root);
182+
183+
delete(&tree, 20);
184+
printf("Delete 20\n");
185+
dump(tree.r, 0, root);
186+
187+
delete(&tree, 9);
188+
printf("Delete 9\n");
189+
dump(tree.r, 0, root);
190+
}
191+
192+
int main()
193+
{
194+
//insert_test();
195+
delete_test();
196+
return 0;
197+
}

c-cpp/28_heap/heap.c

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
#include <time.h>
6+
7+
/* Implement heap */
8+
9+
#define MAX_HEAP_SIZE (1 << 8)
10+
11+
struct element {
12+
int data;
13+
};
14+
15+
struct heap {
16+
union {
17+
unsigned long elements;
18+
struct element *elem[MAX_HEAP_SIZE];
19+
};
20+
};
21+
22+
void init_heap(struct heap *heap)
23+
{
24+
int i;
25+
26+
for(i = 0; i < MAX_HEAP_SIZE; i++) {
27+
heap->elem[i] = NULL;
28+
}
29+
}
30+
31+
void dump_heap(struct heap *heap, int index)
32+
{
33+
struct element *elem;
34+
int level;
35+
36+
if (index > heap->elements)
37+
return;
38+
39+
elem = heap->elem[index];
40+
level = fls(index);
41+
42+
dump_heap(heap, index * 2 + 1);
43+
44+
if (!(index % 2) && index != 1)
45+
printf("%*s\n", level*3, "|");
46+
47+
printf("%*s - %05d\n", level*3, " ", elem->data);
48+
49+
if (index % 2 && index != 1)
50+
printf("%*s\n", level*3, "|");
51+
52+
dump_heap(heap, index * 2);
53+
}
54+
55+
void dump(struct heap *heap, int elements)
56+
{
57+
int i;
58+
59+
for (i = 1; i <= elements; i++)
60+
printf("[%02d]: %4d\n", i, heap->elem[i]->data);
61+
62+
}
63+
64+
struct element* create_element(int data)
65+
{
66+
struct element *elem;
67+
68+
elem = malloc(sizeof(struct element));
69+
70+
if (elem)
71+
elem->data = data;
72+
73+
return elem;
74+
}
75+
76+
void fake_a_heap(struct heap *heap)
77+
{
78+
/* data is in ordered */
79+
int i, data[10] = {7, 4, 9, 2, 6, 8, 10, 1, 3, 5};
80+
81+
init_heap(heap);
82+
83+
/* root start at 1 */
84+
for (i = 0; i < 10; i++)
85+
heap->elem[i+1] = create_element(data[i]);
86+
87+
heap->elements = 10;
88+
}
89+
90+
void swap(struct heap *heap, int i, int j)
91+
{
92+
struct element *tmp;
93+
94+
tmp = heap->elem[j];
95+
heap->elem[j] = heap->elem[i];
96+
heap->elem[i] = tmp;
97+
}
98+
99+
void heapify(struct heap *heap, int parent)
100+
{
101+
struct element **elem = heap->elem;
102+
int elements = heap->elements;
103+
int left, right, max;
104+
105+
while (true) {
106+
left = parent * 2;
107+
right = left + 1;
108+
109+
max = parent;
110+
if (left <= elements && elem[max]->data < elem[left]->data)
111+
max = left;
112+
if (right <= elements && elem[max]->data < elem[right]->data)
113+
max = right;
114+
115+
if (max == parent)
116+
break;
117+
118+
swap(heap, max, parent);
119+
parent = max;
120+
}
121+
}
122+
123+
void build_heap(struct heap *heap)
124+
{
125+
int i;
126+
127+
for (i = heap->elements / 2; i >= 1; i--)
128+
heapify(heap, i);
129+
}
130+
131+
int heap_sort(struct heap *heap)
132+
{
133+
int elements = heap->elements;
134+
135+
while (heap->elements) {
136+
swap(heap, 1, heap->elements);
137+
heap->elements--;
138+
heapify(heap, 1);
139+
}
140+
141+
return elements;
142+
}
143+
144+
int main()
145+
{
146+
struct heap heap;
147+
int elements;
148+
149+
fake_a_heap(&heap);
150+
dump_heap(&heap, 1);
151+
152+
printf("After Heapify:\n");
153+
build_heap(&heap);
154+
dump_heap(&heap, 1);
155+
156+
printf("After Heap sort:\n");
157+
elements = heap_sort(&heap);
158+
dump(&heap, elements);
159+
return 0;
160+
}

0 commit comments

Comments
 (0)