diff options
| author | mo khan <mo.khan@gmail.com> | 2020-07-11 17:03:13 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-07-11 17:03:13 -0600 |
| commit | 23b4a81bb267e486c7bd1d594c400928af8729c8 (patch) | |
| tree | e8cbc2970734f293fbf6cd70b23965059ea8708e /src/02 | |
| parent | 01080bad55e3d7ae47c6b1df64c48496b32ba544 (diff) | |
Implement recursive inorder traversal of binary tree
Diffstat (limited to 'src/02')
| -rw-r--r-- | src/02/01/binary_tree.c | 9 | ||||
| -rw-r--r-- | src/02/01/binary_tree.h | 1 | ||||
| -rw-r--r-- | src/02/01/binary_tree_test.c | 80 |
3 files changed, 90 insertions, 0 deletions
diff --git a/src/02/01/binary_tree.c b/src/02/01/binary_tree.c index 00abae5..7cdd197 100644 --- a/src/02/01/binary_tree.c +++ b/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; diff --git a/src/02/01/binary_tree.h b/src/02/01/binary_tree.h index 3b22eb3..a8d5fb8 100644 --- a/src/02/01/binary_tree.h +++ b/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); diff --git a/src/02/01/binary_tree_test.c b/src/02/01/binary_tree_test.c index 554f322..4804d76 100644 --- a/src/02/01/binary_tree_test.c +++ b/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; } |
