Commit f4eae68

mo khan <mo.khan@gmail.com>
2020-07-18 22:16:47
Use a queue to perform an inorder traversal to determine if a tree is a binary search tree
1 parent 6441d1b
src/02/02/btree.c
@@ -1,4 +1,5 @@
 #include "btree.h"
+#include "queue.h"
 
 BTree *btree_init(int data) {
   BTree *tree = malloc(sizeof(BTree));
@@ -9,8 +10,28 @@ BTree *btree_init(int data) {
 }
 
 bool btree_is_bst(BTree *tree) {
-  if (tree) {
-    return true;
+  if (!tree) {
+    return false;
   }
+
+  Queue *queue = queue_init();
+  queue_enq(queue, tree->left);
+  queue_enq(queue, tree);
+  queue_enq(queue, tree->right);
+
+  // in order traversal
+  // fill queue
+  // iterate through queue and
+  // check if last is less than next
+  while (queue_size(queue) > 0) {
+    BTree *item = queue_deq(queue);
+    if (!item)
+      continue;
+
+    queue_enq(queue, item->left);
+    queue_enq(queue, item);
+    queue_enq(queue, item->right);
+  }
+
   return false;
 }
src/02/02/btree.h
@@ -1,9 +1,9 @@
 #include <stdlib.h>
 #include <stdbool.h>
 
-typedef struct node {
-  struct node *left;
-  struct node *right;
+typedef struct btree_node {
+  struct btree_node *left;
+  struct btree_node *right;
   int data;
 } BTree;
 
src/02/02/btree_test.c
@@ -19,11 +19,19 @@ Ensure(BinaryTree, when_a_tree_has_a_single_node) {
   assert_that(result, is_equal_to(true));
 }
 
+Ensure(BinaryTree, when_the_node_on_the_left_is_greater_than_the_root) {
+  BTree *tree = btree_init(100);
+  tree->left = btree_init(200);
+
+  assert_that(btree_is_bst(tree), is_equal_to(false));
+}
+
 TestSuite *binary_search_tree_tests() {
   TestSuite *suite = create_test_suite();
 
   add_test_with_context(suite, BinaryTree, when_a_tree_is_NULL);
   add_test_with_context(suite, BinaryTree, when_a_tree_has_a_single_node);
+  add_test_with_context(suite, BinaryTree, when_the_node_on_the_left_is_greater_than_the_root);
 
   return suite;
 }
src/02/02/Makefile
@@ -5,7 +5,7 @@ CC=clang
 TEST_LIBS = -lcgreen
 
 BUILDDIR := build
-OBJS := $(addprefix $(BUILDDIR)/,btree.o)
+OBJS := $(addprefix $(BUILDDIR)/,btree.o queue.o)
 TEST_OBJS := $(addprefix $(BUILDDIR)/,btree_test.o)
 
 $(BUILDDIR)/%.o : %.c
src/02/02/queue.c
@@ -0,0 +1,17 @@
+#include "queue.h"
+#include <stdlib.h>
+
+Queue *queue_init() {
+  return NULL;
+}
+
+int queue_size(Queue *queue) {
+  return 0;
+}
+
+void queue_enq(Queue *queue, void* data) {
+}
+
+void *queue_deq(Queue *queue) {
+  return NULL;
+}
src/02/02/queue.h
@@ -0,0 +1,9 @@
+typedef struct sll_node {
+  struct sll_node *next;
+  void *data;
+} Queue;
+
+Queue *queue_init();
+int queue_size(Queue *queue);
+void *queue_deq(Queue *queue);
+void queue_enq(Queue *queue, void* data);