From a4ec04ce1df425682caf6a715dbda812564eabb2 Mon Sep 17 00:00:00 2001 From: Mackenzie Date: Sat, 10 Apr 2021 17:38:35 -0700 Subject: [PATCH] required methods pass --- lib/tree.rb | 108 +++++++++++++++++++++++++++++++++++++--------- test/tree_test.rb | 2 +- 2 files changed, 88 insertions(+), 22 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..565aab6 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -2,12 +2,12 @@ class TreeNode attr_reader :key, :value attr_accessor :left, :right - def initialize(key, val) + def initialize(key, val) @key = key @value = val @left = nil @right = nil - end + end end class Tree @@ -16,42 +16,108 @@ def initialize @root = nil end - # Time Complexity: - # Space Complexity: - def add(key, value) - raise NotImplementedError + # Time Complexity: O(log n) if balanced, up to O(n) if unbalanced + # Space Complexity: O(log n) if balanced, up to O(n) if unbalanced + def add(key, value = nil) + if @root.nil? + @root = TreeNode.new(key,value) + else + add_helper(@root, key, value) + end + end - # Time Complexity: - # Space Complexity: + def add_helper(current_node, key, value) + if current_node.nil? + current_node = TreeNode.new(key, value) + elsif key <= current_node.key + current_node.left = add_helper(current_node.left, key, value) + else + current_node.right = add_helper(current_node.right, key, value) + end + + return current_node + end + + + # Time Complexity: O(log n) if balanced, up to O(n) if unbalanced + # Space Complexity: O(log n) if balanced, up to O(n) if unbalanced def find(key) - raise NotImplementedError + if @root.nil? + return nil + else + find_helper(@root, key) + end end - # Time Complexity: - # Space Complexity: + def find_helper(current_node, key) + if current_node.nil? + return nil + elsif current_node.key == key + return current_node.value + elsif key < current_node.key + find_helper(current_node.left, key) + else + find_helper(current_node.right, key) + end + end + + # Time Complexity: O(n) + # Space Complexity: O(n) def inorder - raise NotImplementedError + return inorder_helper(@root, []) end - # Time Complexity: - # Space Complexity: + def inorder_helper(current, values) + return values if current.nil? + + inorder_helper(current.left, values) + values << {key: current.key, value: current.value} + inorder_helper(current.right, values) + end + + # Time Complexity: O(n) + # Space Complexity: O(n) def preorder - raise NotImplementedError + return preorder_helper(@root, []) end - # Time Complexity: - # Space Complexity: + def preorder_helper(current, values) + return values if current.nil? + + values << {key: current.key, value: current.value} + preorder_helper(current.left, values) + preorder_helper(current.right, values) + end + + + # Time Complexity: O(n) + # Space Complexity: O(n) def postorder - raise NotImplementedError + return postorder_helper(@root, []) end - # Time Complexity: - # Space Complexity: + def postorder_helper(current, values) + return values if current.nil? + + postorder_helper(current.left, values) + postorder_helper(current.right, values) + values << {key: current.key, value: current.value} + end + + # Time Complexity: O(n) + # Space Complexity: O(n) def height - raise NotImplementedError + return height_helper(@root) end + def height_helper(current) + return 0 if current.nil? + + return 1 + [height_helper(current.left), height_helper(current.right)].max + end + + # Optional Method # Time Complexity: # Space Complexity: diff --git a/test/tree_test.rb b/test/tree_test.rb index dbf3447..8cba2bd 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -96,7 +96,7 @@ end it "will report the height for a balanced tree" do - expect(tree_with_nodes.height).must_equal 3 + expect(tree_with_nodes.height).must_equal 4 end it "will report the height for unbalanced trees" do