Commit b9d31fd

mo khan <mo.khan@gmail.com>
2020-07-11 22:54:11
Implement a recursive postorder traversal
1 parent dce786c
src/02/01/binary_tree.c
@@ -18,6 +18,15 @@ void preorder_traversal(Node *node, Visitor visitor) {
   preorder_traversal(node->right, visitor);
 }
 
+void postorder_traversal(Node *node, Visitor visitor) {
+  if (!node)
+    return;
+
+  postorder_traversal(node->left, visitor);
+  postorder_traversal(node->right, visitor);
+  visitor(node);
+}
+
 void destroy(Node *head) {
   free(head);
 }
src/02/01/binary_tree.h
@@ -9,4 +9,5 @@ typedef void(Visitor)(Node* node);
 
 Node *initialize(int data);
 void preorder_traversal(Node *node, Visitor visitor);
+void postorder_traversal(Node *node, Visitor visitor);
 void destroy(Node *head);
src/02/01/binary_tree_test.c
@@ -85,6 +85,74 @@ Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_has_multiple_levels
   assert_that(visited[4], is_equal_to(300));
 }
 
+Ensure(BinaryTree, when_traversing_in_postorder_when_the_tree_is_empty) {
+  postorder_traversal(NULL, visitor);
+
+  assert_that(visited_count, is_equal_to(0));
+}
+
+Ensure(BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_single_node) {
+  Node *node = initialize(100);
+
+  postorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(1));
+  assert_that(visited[0], is_equal_to(100));
+}
+
+Ensure(BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_left_node) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+
+  postorder_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));
+}
+
+Ensure(BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_right_node) {
+  Node *node = initialize(100);
+  node->right = initialize(300);
+
+  postorder_traversal(node, visitor);
+
+  assert_that(visited_count, is_equal_to(2));
+  assert_that(visited[0], is_equal_to(300));
+  assert_that(visited[1], is_equal_to(100));
+}
+
+Ensure(BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_left_and_right_node) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+  node->right = initialize(300);
+
+  postorder_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(300));
+  assert_that(visited[2], is_equal_to(100));
+}
+
+Ensure(BinaryTree, when_traversing_in_postorder_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);
+
+  postorder_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(500));
+  assert_that(visited[2], is_equal_to(200));
+  assert_that(visited[3], is_equal_to(300));
+  assert_that(visited[4], is_equal_to(100));
+}
+
 TestSuite *binary_tree_tests() {
   TestSuite *suite = create_test_suite();
 
@@ -92,6 +160,15 @@ TestSuite *binary_tree_tests() {
   add_test_with_context(suite, BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_single_node);
   add_test_with_context(suite, BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_left_node);
   add_test_with_context(suite, BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_right_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_left_and_right_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_in_preorder_when_the_tree_has_multiple_levels);
+
+  add_test_with_context(suite, BinaryTree, when_traversing_in_postorder_when_the_tree_is_empty);
+  add_test_with_context(suite, BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_single_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_left_node);
+  add_test_with_context(suite, BinaryTree, when_traversing_in_postorder_when_the_tree_has_a_right_node);
+  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);
 
   return suite;
 }