diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..8a27aea 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -1,13 +1,13 @@ 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 @@ -15,50 +15,110 @@ class Tree def initialize @root = nil end - - # Time Complexity: - # Space Complexity: + + # Time Complexity: O(n) + # Space Complexity: O(n) def add(key, value) - raise NotImplementedError + @root = add_helper(@root, key, value) end - # Time Complexity: - # Space Complexity: + def add_helper(current, key, value) + return TreeNode.new(key, value) if current.nil? + if key < current.key + current.left = add_helper(current.left, key, value) + else + current.right = add_helper(current.right, key, value) + end + return current + end + + # Time Complexity: O(log n) + # Space Complexity: O(log n) def find(key) - raise NotImplementedError + return find_helper(@root, key) end - # Time Complexity: - # Space Complexity: + def find_helper(current, key) + return nil if current.nil? + return current.value if current.key == key + if key > current.key + return find_helper(current.right, key) + else + return find_helper(current.left, 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, list) + return list if current.nil? + + inorder_helper(current.left, list) + list << { key: current.key, value: current.value } + inorder_helper(current.right, list) + + return list + 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, list) + return list if current.nil? + list << {key: current.key, value: current.value} + preorder_helper(current.left, list) + preorder_helper(current.right, list) + return list + 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, list) + return list if current.nil? + postorder_helper(current.left, list) + postorder_helper(current.right, list) + list << {key: current.key, value: current.value} + return list + end + + # Time Complexity: O(n) + # Space Complexity: O(n) def height - raise NotImplementedError + return height_helper(@root, 0, 1) + end + + def height_helper(current, max, count) + return max if current.nil? + + max = count if count > max + height_helper(current.left, max, (count + 1)) + height_helper(current.right, max, (count + 1)) + end + # def delete(key) + # return nil if self.find(key).nil? + + # end + # Optional Method # Time Complexity: # Space Complexity: def bfs raise NotImplementedError end - + # Useful for printing def to_s return "#{self.inorder}" diff --git a/test/tree_test.rb b/test/tree_test.rb index 345bf66..cf8d811 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -67,7 +67,7 @@ end end - describe "breadth first search" do + xdescribe "breadth first search" do it "will give an empty array for an empty tree" do expect(tree.bfs).must_equal [] end