Commit 23b4a81

mo khan <mo.khan@gmail.com>
2020-07-11 23:03:13
Implement recursive inorder traversal of binary tree
1 parent 01080ba
src/02/01/binary_tree.c
@@ -18,6 +18,15 @@ void preorder_traversal(Node *node, Visitor visitor) {
   preorder_traversal(node->right, visitor);
 }
 
+void inorder_traversal(Node *node, Visitor visitor) {
+  if (!node)
+    return;
+
+  inorder_traversal(node->left, visitor);
+  visitor(node);
+  inorder_traversal(node->right, visitor);
+}
+
 void postorder_traversal(Node *node, Visitor visitor) {
   if (!node)
     return;
src/02/01/binary_tree.h
@@ -9,5 +9,6 @@ typedef void(Visitor)(Node* node);
 
 Node *initialize(int data);
 void preorder_traversal(Node *node, Visitor visitor);
+void inorder_traversal(Node *node, Visitor visitor);
 void postorder_traversal(Node *node, Visitor visitor);
 void destroy(Node *head);
src/02/01/binary_tree_test.c
@@ -163,6 +163,79 @@ Ensure(BinaryTree, when_traversing_in_postorder_when_the_tree_has_multiple_level
   destroy(node);
 }
 
+Ensure(BinaryTree, when_traversing_inorder_when_the_tree_is_empty) {
+  inorder_traversal(NULL, visitor);
+
+  assert_that(visited_count, is_equal_to(0));
+}
+
+Ensure(BinaryTree, when_traversing_inorder_when_the_tree_has_a_single_node) {
+  Node *node = initialize(100);
+
+  inorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(1));
+  assert_that(visited[0], is_equal_to(100));
+  destroy(node);
+}
+
+Ensure(BinaryTree, when_traversing_inorder_when_the_tree_has_a_left_node) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+
+  inorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(2));
+  assert_that(visited[0], is_equal_to(200));
+  assert_that(visited[1], is_equal_to(100));
+  destroy(node);
+}
+
+Ensure(BinaryTree, when_traversing_inorder_when_the_tree_has_a_right_node) {
+  Node *node = initialize(100);
+  node->right = initialize(300);
+
+  inorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(2));
+  assert_that(visited[0], is_equal_to(100));
+  assert_that(visited[1], is_equal_to(300));
+  destroy(node);
+}
+
+Ensure(BinaryTree, when_traversing_inorder_when_the_tree_has_a_left_and_right_node) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+  node->right = initialize(300);
+
+  inorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(3));
+  assert_that(visited[0], is_equal_to(200));
+  assert_that(visited[1], is_equal_to(100));
+  assert_that(visited[2], is_equal_to(300));
+  destroy(node);
+}
+
+Ensure(BinaryTree, when_traversing_inorder_when_the_tree_has_multiple_levels) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+  node->right = initialize(300);
+
+  node->left->left = initialize(400);
+  node->left->right = initialize(500);
+
+  inorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(5));
+  assert_that(visited[0], is_equal_to(400));
+  assert_that(visited[1], is_equal_to(200));
+  assert_that(visited[2], is_equal_to(500));
+  assert_that(visited[3], is_equal_to(100));
+  assert_that(visited[4], is_equal_to(300));
+  destroy(node);
+}
+
 TestSuite *binary_tree_tests() {
   TestSuite *suite = create_test_suite();
 
@@ -180,6 +253,13 @@ TestSuite *binary_tree_tests() {
   add_test_with_context(suite, BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_left_and_right_node);
   add_test_with_context(suite, BinaryTree, when_traversing_in_postorder_when_the_tree_has_multiple_levels);
 
+  add_test_with_context(suite, BinaryTree, when_traversing_inorder_when_the_tree_is_empty);
+  add_test_with_context(suite, BinaryTree, when_traversing_inorder_when_the_tree_has_a_single_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_inorder_when_the_tree_has_a_left_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_inorder_when_the_tree_has_a_right_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_inorder_when_the_tree_has_a_left_and_right_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_inorder_when_the_tree_has_multiple_levels);
+
   return suite;
 }