Commit 705dc38

mo khan <mo.khan@gmail.com>
2020-07-11 22:43:04
Complete preorder traversal of a binary tree
1 parent 1efedbd
src/02/01/binary_tree.c
@@ -0,0 +1,23 @@
+#include "binary_tree.h"
+#include <stdlib.h>
+
+Node *initialize(int data) {
+  Node *item = malloc(sizeof(Node));
+  item->data = data;
+  item->left = NULL;
+  item->right = NULL;
+  return item;
+}
+
+void preorder_next(Node *node, Visitor visitor) {
+  if (!node)
+    return;
+
+  visitor(node);
+  preorder_next(node->left, visitor);
+  preorder_next(node->right, visitor);
+}
+
+void destroy(Node *head) {
+  free(head);
+}
src/02/01/binary_tree.h
@@ -0,0 +1,12 @@
+struct node {
+  int data;
+  struct node *left;
+  struct node *right;
+};
+
+typedef struct node Node;
+typedef void(Visitor)(Node* node);
+
+Node *initialize(int data);
+void preorder_next(Node *node, Visitor visitor);
+void destroy(Node *head);
src/02/01/binary_tree_test.c
@@ -0,0 +1,103 @@
+#include "binary_tree.h"
+#include <cgreen/cgreen.h>
+#include <string.h>
+
+int visited[256];
+int visited_count;
+
+Describe(BinaryTree);
+BeforeEach(BinaryTree) {
+  memset(visited, 0, sizeof(visited));
+  visited_count = 0;
+}
+AfterEach(BinaryTree) {}
+
+void visitor(Node *node) {
+  visited[visited_count] = node->data;
+  visited_count++;
+}
+
+Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_is_empty) {
+  preorder_next(NULL, visitor);
+
+  assert_that(visited_count, is_equal_to(0));
+}
+
+Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_single_node) {
+  Node *node = initialize(100);
+
+  preorder_next(node, visitor);
+
+  assert_that(visited_count, is_equal_to(1));
+  assert_that(visited[0], is_equal_to(100));
+}
+
+Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_left_node) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+
+  preorder_next(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(200));
+}
+
+Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_right_node) {
+  Node *node = initialize(100);
+  node->right = initialize(300);
+
+  preorder_next(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));
+}
+
+Ensure(BinaryTree, when_traversing_in_preorder_when_the_tree_has_a_left_and_right_node) {
+  Node *node = initialize(100);
+  node->left = initialize(200);
+  node->right = initialize(300);
+
+  preorder_next(node, visitor);
+
+  assert_that(visited_count, is_equal_to(3));
+  assert_that(visited[0], is_equal_to(100));
+  assert_that(visited[1], is_equal_to(200));
+  assert_that(visited[2], is_equal_to(300));
+}
+
+Ensure(BinaryTree, when_traversing_in_preorder_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);
+
+  preorder_next(node, visitor);
+
+  assert_that(visited_count, is_equal_to(5));
+  assert_that(visited[0], is_equal_to(100));
+  assert_that(visited[1], is_equal_to(200));
+  assert_that(visited[2], is_equal_to(400));
+  assert_that(visited[3], is_equal_to(500));
+  assert_that(visited[4], is_equal_to(300));
+}
+
+TestSuite *binary_tree_tests() {
+  TestSuite *suite = create_test_suite();
+
+  add_test_with_context(suite, BinaryTree, when_traversing_in_preorder_when_the_tree_is_empty);
+  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);
+
+  return suite;
+}
+
+int main(int argc, char **argv) {
+  TestSuite *suite = create_test_suite();
+  add_suite(suite, binary_tree_tests());
+  return run_test_suite(suite, create_text_reporter());
+}
src/02/01/main.c
@@ -0,0 +1,9 @@
+#include "binary_tree.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[]) {
+  printf("=== COMP-272 - Assignment 02 - Question 01 ===\n");
+  printf("Bye\n");
+  return 0;
+}
src/02/01/Makefile
@@ -0,0 +1,37 @@
+#!/usr/bin/make -f
+SHELL=/bin/sh
+
+CC=clang
+TEST_LIBS = -lcgreen
+
+BUILDDIR := build
+OBJS := $(addprefix $(BUILDDIR)/,binary_tree.o)
+TEST_OBJS := $(addprefix $(BUILDDIR)/,binary_tree_test.o)
+
+$(BUILDDIR)/%.o : %.c
+	$(COMPILE.c) $(OUTPUT_OPTION) $<
+
+.PHONY: all
+all: $(OBJS) $(BUILDDIR)/main.o
+	$(CC) $(OBJS) $(BUILDDIR)/main.o -o $(BUILDDIR)/program
+
+.PHONY: test
+test: $(OBJS) $(TEST_OBJS)
+	$(CC) $(OBJS) $(TEST_OBJS) $(TEST_LIBS) -o $(BUILDDIR)/test
+
+$(OBJS): | $(BUILDDIR)
+
+$(TEST_OBJS): | $(BUILDDIR)
+
+$(BUILDDIR):
+	mkdir $(BUILDDIR)
+
+.PHONY: clean
+clean:
+	rm -fr build
+
+run : all
+	./build/program
+
+run_test : test
+	cgreen-runner -c -v $(BUILDDIR)/test