summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-07-11 17:03:13 -0600
committermo khan <mo.khan@gmail.com>2020-07-11 17:03:13 -0600
commit23b4a81bb267e486c7bd1d594c400928af8729c8 (patch)
treee8cbc2970734f293fbf6cd70b23965059ea8708e /src
parent01080bad55e3d7ae47c6b1df64c48496b32ba544 (diff)
Implement recursive inorder traversal of binary tree
Diffstat (limited to 'src')
-rw-r--r--src/02/01/binary_tree.c9
-rw-r--r--src/02/01/binary_tree.h1
-rw-r--r--src/02/01/binary_tree_test.c80
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;
}