Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 75bb89c

Browse files
Binary search tree iterator
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent c8a5953 commit 75bb89c

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
all:
2+
gcc -O2 -o test bst_iter.c
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
5+
struct TreeNode {
6+
int val;
7+
struct TreeNode *left;
8+
struct TreeNode *right;
9+
};
10+
11+
struct ListNode {
12+
int val;
13+
struct ListNode *next;
14+
};
15+
16+
struct BSTIterator {
17+
struct ListNode dummy;
18+
struct ListNode *p;
19+
};
20+
21+
static void bst_iter_generater(struct TreeNode *node, struct BSTIterator *iter)
22+
{
23+
if (node->left != NULL) {
24+
bst_iter_generater(node->left, iter);
25+
}
26+
27+
struct ListNode *new = malloc(sizeof(*new));
28+
new->val = node->val;
29+
new->next = NULL;
30+
if (iter->p != NULL) {
31+
iter->p->next = new;
32+
} else {
33+
iter->dummy.next = new;
34+
}
35+
iter->p = new;
36+
37+
if (node->right != NULL) {
38+
bst_iter_generater(node->right, iter);
39+
}
40+
}
41+
42+
static struct BSTIterator *bstIteratorCreate(struct TreeNode *root)
43+
{
44+
struct BSTIterator *iter = malloc(sizeof(*iter));
45+
if (root != NULL) {
46+
iter->p = NULL;
47+
bst_iter_generater(root, iter);
48+
}
49+
iter->p = &iter->dummy;
50+
return iter;
51+
}
52+
53+
/** @return whether we have a next smallest number */
54+
static bool bstIteratorHasNext(struct BSTIterator *iter)
55+
{
56+
return iter->p->next != NULL;
57+
}
58+
59+
/** @return the next smallest number */
60+
static int bstIteratorNext(struct BSTIterator *iter)
61+
{
62+
iter->p = iter->p->next;
63+
return iter->p->val;
64+
}
65+
66+
/** Deallocates memory iteriously allocated for the iterator */
67+
static void bstIteratorFree(struct BSTIterator *iter)
68+
{
69+
iter->p = iter->dummy.next;
70+
while (iter->p != NULL) {
71+
iter->dummy.next = iter->p->next;
72+
free(iter->p);
73+
iter->p = iter->dummy.next;
74+
}
75+
}
76+
77+
int main(void)
78+
{
79+
#if 1
80+
struct TreeNode root;
81+
root.val = 7;
82+
83+
struct TreeNode node1[2];
84+
node1[0].val = 3;
85+
node1[1].val = 15;
86+
87+
struct TreeNode node2[4];
88+
node2[2].val = 9;
89+
node2[3].val = 20;
90+
91+
root.left = &node1[0];
92+
root.right = &node1[1];
93+
94+
node1[0].left = NULL;
95+
node1[0].right = NULL;
96+
node1[1].left = &node2[2];
97+
node1[1].right = &node2[3];
98+
#else
99+
struct TreeNode root;
100+
root.val = 1;
101+
102+
struct TreeNode node1[2];
103+
node1[0].val = 2;
104+
node1[1].val = 3;
105+
106+
struct TreeNode node2[4];
107+
node2[0].val = 4;
108+
node2[3].val = 5;
109+
110+
root.left = &node1[0];
111+
root.right = &node1[1];
112+
113+
node1[0].left = &node2[0];
114+
node1[0].right = NULL;
115+
node1[1].left = NULL;
116+
node1[1].right = &node2[3];
117+
#endif
118+
119+
node2[0].left = NULL;
120+
node2[0].right = NULL;
121+
node2[1].left = NULL;
122+
node2[1].right = NULL;
123+
node2[2].left = NULL;
124+
node2[2].right = NULL;
125+
node2[3].left = NULL;
126+
node2[3].right = NULL;
127+
128+
struct BSTIterator *i = bstIteratorCreate(&root);
129+
while (bstIteratorHasNext(i)) {
130+
printf("%d\n", bstIteratorNext(i));
131+
}
132+
bstIteratorFree(i);
133+
return 0;
134+
}

0 commit comments

Comments
 (0)