Commit b010af7

mo khan <mo.khan@gmail.com>
2020-07-13 01:14:25
Find the next node in a preorder traversal
1 parent b08b548
Changed files (1)
src/02/01/binary_tree_test.c
@@ -2,21 +2,53 @@
 #include <cgreen/cgreen.h>
 #include <string.h>
 
-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);