From b010af7eadb08bc9811005688ab5e5ffe38bf192 Mon Sep 17 00:00:00 2001 From: mo khan Date: Sun, 12 Jul 2020 19:14:25 -0600 Subject: Find the next node in a preorder traversal --- src/02/01/binary_tree_test.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/02/01/binary_tree_test.c b/src/02/01/binary_tree_test.c index f1856b6..db0a705 100644 --- a/src/02/01/binary_tree_test.c +++ b/src/02/01/binary_tree_test.c @@ -2,21 +2,53 @@ #include #include -int visited[256]; +int visited[32]; +Node *nodes[32]; int visited_count; Describe(BinaryTree); BeforeEach(BinaryTree) { memset(visited, 0, sizeof(visited)); + memset(nodes, 0, sizeof(nodes)); visited_count = 0; } AfterEach(BinaryTree) {} void visitor(Node *node) { visited[visited_count] = node->data; + nodes[visited_count] = node; visited_count++; } +Node *preorder_next(Node *self, Node *x) { + traverse(self, visitor, PREORDER); + + for (int i = 0; i < visited_count; i++) + if (nodes[i] == x) + return nodes[i + 1]; + return NULL; +} + +Ensure(BinaryTree, when_finding_the_next_node_in_a_preorder_traversal) { + Node *a = initialize(100); + Node *b = initialize(200); + Node *c = initialize(300); + Node *d = initialize(400); + Node *e = initialize(500); + + a->left = b; + a->right = c; + b->left = d; + b->right = e; + + assert_that(preorder_next(a, a), is_equal_to(b)); + assert_that(preorder_next(a, b), is_equal_to(d)); + assert_that(preorder_next(a, d), is_equal_to(e)); + assert_that(preorder_next(a, e), is_equal_to(c)); + + destroy(a); +} + Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_is_empty) { traverse(NULL, visitor, PREORDER); -- cgit v1.2.3