From 68bb9f47f55ab7f0da0ec4ec729dd314b87beadd Mon Sep 17 00:00:00 2001 From: Ngoc Le Date: Thu, 19 Sep 2019 08:03:24 -0700 Subject: [PATCH 1/2] added add and inorder functions --- lib/tree.rb | 80 ++++++++++++++++++++++++++++++++++++++++++++--- test/tree_test.rb | 4 +-- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..d8bc4af 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,22 +16,71 @@ def initialize @root = nil end + def add_helper(current, new_node) + #p current.key + if new_node.key <= current.key + if current.left.nil? + current.left = new_node + else + add_helper(current.left, new_node) + end + else + if current.right.nil? + current.right = new_node + else + add_helper(current.right, new_node) + end + end + end # Time Complexity: # Space Complexity: def add(key, value) - raise NotImplementedError + puts "" + new_node = TreeNode.new(key, value) + if @root.nil? + @root = new_node + else + add_helper(@root, new_node) + end end - # Time Complexity: + # Time Complexity: O(logn) # Space Complexity: + def find_helper(current,key) + return nil if current.nil? + #p current.key + if key == current.key + return current.value + end + if key < current.key + return find_helper(current.left, key) + end + if key > current.key + return find_helper(current.right, key) + end + end + def find(key) - raise NotImplementedError + return find_helper(@root,key) end # Time Complexity: # Space Complexity: - def inorder - raise NotImplementedError + # def inorder_traverse(node) + # if node == nil + # return + # else inorder_traverse(node.left) + # return node.value + + # end + def inorder(node) + if node == nil + return + else + inorder(node.left) + print "#{node.key} " + inorder(node.right) + end end # Time Complexity: @@ -64,3 +113,24 @@ def to_s return "#{self.inorder}" end end + +tree = Tree.new +tree.add(27,"abbie") +tree.inorder(tree.root) +tree.add(50,"barney") +tree.inorder(tree.root) +tree.add(45,"cat") +tree.inorder(tree.root) +tree.add(3,"dog") + +tree.inorder(tree.root) + +# puts tree.find(45) + +# puts tree.find(27) +# puts tree.find(50) +# puts tree.find(45) +# puts tree.find(3) +# puts tree.find(-1) +# puts tree.find(10) +# puts tree.root.right.value \ No newline at end of file diff --git a/test/tree_test.rb b/test/tree_test.rb index 222b693..39dc179 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -9,7 +9,7 @@ let (:tree_with_nodes) { tree.add(5, "Peter") tree.add(3, "Paul") - tree.add(1, "Mary") + tree.add(1, "Mary") tree.add(10, "Karla") tree.add(15, "Ada") tree.add(25, "Kari") @@ -39,7 +39,7 @@ it "will return the tree in order" do expect(tree_with_nodes.inorder).must_equal [{:key=>1, :value=>"Mary"}, {:key=>3, :value=>"Paul"}, - {:key=>5, :value=>"Peter"}, {:key=>10, :value=>"Karla"}, + {:key=>5, :value=>"Peter"}, {:key=>10, :value=>"Karla"}, {:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}] end end From 318c05191b36dca8b4da44e3ec4b494f97d67ad5 Mon Sep 17 00:00:00 2001 From: Ngoc Le Date: Sun, 22 Sep 2019 23:11:49 -0700 Subject: [PATCH 2/2] added the rest of the functions --- lib/tree.rb | 160 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 97 insertions(+), 63 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index d8bc4af..d4ef564 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,8 +16,20 @@ def initialize @root = nil end + + # Time Complexity: O(log n) + # Space Complexity: O(1) + def add(key, value) + puts "" + new_node = TreeNode.new(key, value) + if @root.nil? + @root = new_node + else + add_helper(@root, new_node) + end + end + def add_helper(current, new_node) - #p current.key if new_node.key <= current.key if current.left.nil? current.left = new_node @@ -32,23 +44,10 @@ def add_helper(current, new_node) end end end - # Time Complexity: - # Space Complexity: - def add(key, value) - puts "" - new_node = TreeNode.new(key, value) - if @root.nil? - @root = new_node - else - add_helper(@root, new_node) - end - end - - # Time Complexity: O(logn) - # Space Complexity: + # Time Complexity: O(log n) + # Space Complexity: O(1) def find_helper(current,key) return nil if current.nil? - #p current.key if key == current.key return current.value end @@ -64,48 +63,103 @@ def find(key) return find_helper(@root,key) end - # Time Complexity: - # Space Complexity: - # def inorder_traverse(node) - # if node == nil - # return - # else inorder_traverse(node.left) - # return node.value - - # end - def inorder(node) - if node == nil - return - else - inorder(node.left) - print "#{node.key} " - inorder(node.right) - end + # Time Complexity: O(log n) + # Space Complexity: O(n) - an new array is created to store the in-order nodes + + def inorder + inorder_array = [] + return inorder_array if @root == nil + current = @root + return inorder_helper(current, inorder_array) end - # Time Complexity: - # Space Complexity: + def inorder_helper(current, inorder_array) + if current == nil + return inorder_array + else + inorder_helper(current.left, inorder_array) + inorder_array.push({:key => current.key, :value => current.value}) + inorder_helper(current.right, inorder_array) + end + end + + # Time Complexity: O(log n) + # Space Complexity: O(n) def preorder - raise NotImplementedError + array = [] + return array if @root == nil + current = @root + return preorder_helper(current, array) end - # Time Complexity: - # Space Complexity: + def preorder_helper(current, array) + if current == nil + return array + else + array.push({:key => current.key, :value => current.value}) + preorder_helper(current.left, array) + preorder_helper(current.right, array) + end + end + + # Time Complexity: O(log n) + # Space Complexity: O(n) def postorder - raise NotImplementedError + array = [] + return array if @root == nil + current = @root + return postorder_helper(current, array) + end + + def postorder_helper(current, array) + if current == nil + return array + else + postorder_helper(current.left, array) + postorder_helper(current.right, array) + array.push({:key => current.key, :value => current.value}) + end end # Time Complexity: # Space Complexity: def height - raise NotImplementedError + current = @root + height = 1 + return 0 if @root.nil? + return height_helper(current,height) + end + + def height_helper(current, height) + if current.nil? + return height + else + height += 1 + height_helper(current.left,height) + end end # Optional Method - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def bfs - raise NotImplementedError + queue = Queue.new + if @root.nil? + return [] + end + array = [] + queue.push(@root) + while !queue.empty? + node = queue.pop + array.push({:key => node.key, :value => node.value}) + if !node.left.nil? + queue.push(node.left) + end + if !node.right.nil? + queue.push(node.right) + end + end + return array end # Useful for printing @@ -114,23 +168,3 @@ def to_s end end -tree = Tree.new -tree.add(27,"abbie") -tree.inorder(tree.root) -tree.add(50,"barney") -tree.inorder(tree.root) -tree.add(45,"cat") -tree.inorder(tree.root) -tree.add(3,"dog") - -tree.inorder(tree.root) - -# puts tree.find(45) - -# puts tree.find(27) -# puts tree.find(50) -# puts tree.find(45) -# puts tree.find(3) -# puts tree.find(-1) -# puts tree.find(10) -# puts tree.root.right.value \ No newline at end of file