diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..58f02f8 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -17,39 +17,52 @@ def initialize end # Time Complexity: - # Space Complexity: - def add(key, value) - raise NotImplementedError + # Space Complexity: + def add(key, value = nil) + new_node = TreeNode.new(key, value) + if @root.nil? + @root = new_node + else + add_helper(@root, new_node) + end end # Time Complexity: - # Space Complexity: + # Space Complexity: def find(key) - raise NotImplementedError + if @root.nil? + return nil + else + return find_helper(@root, key) + end + end # Time Complexity: # Space Complexity: def inorder - raise NotImplementedError + return [] if @root.nil? + return inorder_helper(@root, []) end # Time Complexity: # Space Complexity: def preorder - raise NotImplementedError + return [] if @root.nil? + return preorder_helper(@root, []) end # Time Complexity: # Space Complexity: def postorder - raise NotImplementedError + return [] if @root.nil? + return postorder_helper(@root, []) end # Time Complexity: # Space Complexity: def height - raise NotImplementedError + return height_helper(@root) end # Optional Method @@ -63,4 +76,62 @@ def bfs def to_s return "#{self.inorder}" end -end + +private + def add_helper(current_node, new_node) + return new_node if current_node.nil? + + if new_node.key <= current_node.key + current_node.left = add_helper(current_node.left, new_node) + else + current_node.right = add_helper(current_node.right, new_node) + end + + return current_node + end + + def find_helper(node, key) + if node.nil? + return nil + elsif node.key > key + return find_helper(node.left, key) + elsif node.key < key + return find_helper(node.right, key) + else + return node.value + end + end + + def inorder_helper(node, array) + if node + inorder_helper(node.left, array) + array << {key: node.key, value: node.value} + inorder_helper(node.right, array) + end + return array + end + + def preorder_helper(node, array) + if node + array << {key: node.key, value: node.value} + preorder_helper(node.left, array) + preorder_helper(node.right, array) + end + return array + end + + def postorder_helper(node, array) + if node + postorder_helper(node.left, array) + postorder_helper(node.right, array) + array << {key: node.key, value: node.value} + end + return array + end + + def height_helper(node) + return 0 if node.nil? + return 1 + [height_helper(node.right), height_helper(node.left)].max + end + +end \ No newline at end of file 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