From 648437234171f69e47beeb2a15dc12251636de6a Mon Sep 17 00:00:00 2001 From: Jessica Stone Date: Tue, 1 Sep 2020 07:58:09 -0700 Subject: [PATCH 1/6] implement add, find, and order methods --- lib/tree.rb | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 5 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..f1f1378 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -14,36 +14,118 @@ class Tree attr_reader :root def initialize @root = nil + @nodes = [] end # Time Complexity: # Space Complexity: def add(key, value) - raise NotImplementedError + if @root == nil + @root = TreeNode.new(key, value) + return + end + + current = @root + if key <= current.key + until current.left.nil? + current = current.left + end + current.left = TreeNode.new(key, value) + elsif key > current.key + until current.right.nil? + current = current.right + end + current.right = TreeNode.new(key, value) + end + + return + end + + # helper method + def add_node(direction) + if current.direction.nil? + current.direction = TreeNode.new(key, value) + else + find_nil(direction) + end end # Time Complexity: # Space Complexity: def find(key) - raise NotImplementedError + return nil if @root.nil? + return @root.value if @root.key == key + + current = @root + find_key = traverse(current, key) + + return find_key + end + + def traverse(current, key) + if key < current.key + current = current.left + return current.value if current.key == key + traverse(current, key) + elsif key > current.key + current = current.right + return current.value if current.key == key + traverse(current, key) + end + end + + def traverse_left(tree) + if tree.left.nil? + return tree + else + traverse_left(tree.left) + end + end + + # inorder helper + def traverse_inorder(tree) + traverse_inorder(tree.left) if tree.left + @nodes.push({key: tree.key, value: tree.value}) + traverse_inorder(tree.right) if tree.right end # Time Complexity: # Space Complexity: + # left, root, right def inorder - raise NotImplementedError + return [] if @root.nil? + traverse_inorder(@root) + return @nodes end + # preorder helper + def traverse_preorder(tree) + @nodes.push({key: tree.key, value: tree.value}) + traverse_preorder(tree.left) if tree.left + traverse_preorder(tree.right) if tree.right + end + # Time Complexity: # Space Complexity: def preorder - raise NotImplementedError + return [] if @root.nil? + traverse_preorder(@root) + return @nodes end + # postorder helper + def traverse_postorder(tree) + traverse_postorder(tree.left) if tree.left + traverse_postorder(tree.right) if tree.right + @nodes.push({key: tree.key, value: tree.value}) + end + # Time Complexity: # Space Complexity: def postorder - raise NotImplementedError + return [] if @root.nil? + traverse_postorder(@root) + return @nodes end # Time Complexity: From 68328a0a102f73ac542bbbc6535dd57f7f9aa7e2 Mon Sep 17 00:00:00 2001 From: Jessica Stone Date: Tue, 1 Sep 2020 12:16:40 -0700 Subject: [PATCH 2/6] remove unused function --- lib/tree.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index f1f1378..a2aa89f 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -74,14 +74,6 @@ def traverse(current, key) end end - def traverse_left(tree) - if tree.left.nil? - return tree - else - traverse_left(tree.left) - end - end - # inorder helper def traverse_inorder(tree) traverse_inorder(tree.left) if tree.left From 8e38c0e31008ef058ee6d83f9c498aa9c7f21664 Mon Sep 17 00:00:00 2001 From: Jessica Stone Date: Tue, 1 Sep 2020 18:59:08 -0700 Subject: [PATCH 3/6] fix add method --- lib/tree.rb | 53 +++++++++++++++++++++++++++-------------------- test/tree_test.rb | 9 ++++++++ 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index a2aa89f..8cec96b 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -17,6 +17,16 @@ def initialize @nodes = [] end + def add_helper(current, key) + if key <= current.key + return current if current.left.nil? + add_helper(current.left, key) + else + return current if current.right.nil? + add_helper(current.right, key) + end + end + # Time Complexity: # Space Complexity: def add(key, value) @@ -25,28 +35,11 @@ def add(key, value) return end - current = @root - if key <= current.key - until current.left.nil? - current = current.left - end - current.left = TreeNode.new(key, value) - elsif key > current.key - until current.right.nil? - current = current.right - end - current.right = TreeNode.new(key, value) - end - - return - end - - # helper method - def add_node(direction) - if current.direction.nil? - current.direction = TreeNode.new(key, value) + node = add_helper(@root, key) + if key <= node.key + node.left = TreeNode.new(key, value) else - find_nil(direction) + node.right = TreeNode.new(key, value) end end @@ -64,8 +57,8 @@ def find(key) def traverse(current, key) if key < current.key - current = current.left return current.value if current.key == key + current = current.left traverse(current, key) elsif key > current.key current = current.right @@ -120,10 +113,26 @@ def postorder return @nodes end + # inorder helper + # def height_helper(tree, height) + # left_height = height_helper(tree.left, height+1) if tree.left + # right_height = height_helper(tree.right, height+1) if tree.right + # if left_height >= right_height + # return left_height + # else + # return right_height + # end + # end + # Time Complexity: # Space Complexity: def height raise NotImplementedError + # return 0 if @root.nil? + # return 1 if (@root.left.nil? && @root.right.nil?) + + # height = 0 + # return height_helper(@root, height + 1) end # Optional Method diff --git a/test/tree_test.rb b/test/tree_test.rb index 21c4a80..5bc115f 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -49,6 +49,15 @@ expect(tree_with_nodes.inorder).must_equal [{:key=>1, :value=>"Mary"}, {:key=>3, :value=>"Paul"}, {:key=>5, :value=>"Peter"}, {:key=>10, :value=>"Karla"}, {:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}] + expect(balanced_tree.inorder).must_equal [ + {:key=>1, :value=>"Mary"}, + {:key=>3, :value=>"Paul"}, + {:key=>4, :value=>"Kate"}, + {:key=>5, :value=>"Peter"}, + {:key=>8, :value=>"Ada"}, + {:key=>10, :value=>"Karla"}, + {:key=>25, :value=>"Kari"} + ] end end From 0dcd99a9123b864f8048ae01f5d2719e676e6475 Mon Sep 17 00:00:00 2001 From: Jessica Stone Date: Tue, 1 Sep 2020 19:01:03 -0700 Subject: [PATCH 4/6] add additional tests to confirm methods are working --- test/tree_test.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/tree_test.rb b/test/tree_test.rb index 5bc115f..1f45c90 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -34,6 +34,16 @@ tree.add(3, "Paul") expect(tree.find(3)).must_equal "Paul" + + tree.add(4, "Mary") + expect(tree.find(4)).must_equal "Mary" + + tree.add(10, "Karla") + expect(tree.find(10)).must_equal "Karla" + + tree.add(1, "Jenny") + expect(tree.find(1)).must_equal "Jenny" + end it "can't find anything when the tree is empty" do From 030e4e600016caf9dbe521f016e7d7df92a7eed8 Mon Sep 17 00:00:00 2001 From: Jessica Stone Date: Tue, 1 Sep 2020 19:07:43 -0700 Subject: [PATCH 5/6] fix and cleanup finder_helper --- lib/tree.rb | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 8cec96b..975fc35 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -43,6 +43,16 @@ def add(key, value) end end + def find_helper(current, key) + if key <= current.key + return current.value if current.key == key + find_helper(current.left, key) + elsif key > current.key + return current.value if current.key == key + find_helper(current.right, key) + end + end + # Time Complexity: # Space Complexity: def find(key) @@ -50,23 +60,11 @@ def find(key) return @root.value if @root.key == key current = @root - find_key = traverse(current, key) + find_key = find_helper(current, key) return find_key end - def traverse(current, key) - if key < current.key - return current.value if current.key == key - current = current.left - traverse(current, key) - elsif key > current.key - current = current.right - return current.value if current.key == key - traverse(current, key) - end - end - # inorder helper def traverse_inorder(tree) traverse_inorder(tree.left) if tree.left From 8da466b2b13f9737ec8088b1ebcf5307b75cd104 Mon Sep 17 00:00:00 2001 From: Jessica Stone Date: Tue, 1 Sep 2020 19:22:40 -0700 Subject: [PATCH 6/6] started working on height --- lib/tree.rb | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 975fc35..4afb8d3 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -111,26 +111,24 @@ def postorder return @nodes end - # inorder helper - # def height_helper(tree, height) - # left_height = height_helper(tree.left, height+1) if tree.left - # right_height = height_helper(tree.right, height+1) if tree.right - # if left_height >= right_height - # return left_height - # else - # return right_height - # end - # end + def height_helper(tree, height) + return height_helper(tree.left, height) if tree.left + return height_helper(tree.right, height) if tree.right + return height + 1 + end # Time Complexity: # Space Complexity: def height - raise NotImplementedError - # return 0 if @root.nil? - # return 1 if (@root.left.nil? && @root.right.nil?) + return 0 if @root.nil? + return 1 if (@root.left.nil? && @root.right.nil?) + + left_height = 1 + height_helper(@root.left, 1) if @root.left + right_height = 1 + height_helper(@root.right, 1) if @root.right - # height = 0 - # return height_helper(@root, height + 1) + return left_height >= right_height ? left_height : right_height end # Optional Method