From 8ef70e1659f401aad4877352df3b3c46d53b97e8 Mon Sep 17 00:00:00 2001 From: Alice Date: Wed, 26 Feb 2020 19:05:21 -0800 Subject: [PATCH 1/2] tree --- lib/tree.rb | 105 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..fc97dd8 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,121 @@ class Tree def initialize @root = nil end - + # Time Complexity: # Space Complexity: def add(key, value) - raise NotImplementedError + if @root.nil? + @root = TreeNode.new(key, value) + else + add_helper(@root, key, value) + end end - + + def add_helper(current, key, value) + if current.nil? + return TreeNode.new(key, value) + else + if key < current.key + current.left = add_helper(current.left, key, value) + else + current.right = add_helper(current.right, key, value) + end + end + return current + end + # Time Complexity: # Space Complexity: def find(key) - raise NotImplementedError + return nil if @root.nil? + + find_helper(@root, key) end - + + def find_helper(current, key) + return nil if current.nil? + + if key == current.key + return current.value + elsif key < current.key + find_helper(current.left, key) + else + find_helper(current.right, key) + end + + end + # Time Complexity: # Space Complexity: def inorder - raise NotImplementedError + inorder_helper(@root, []) end - + + 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) + end + # Time Complexity: # Space Complexity: def preorder - raise NotImplementedError + preorder_helper(@root, []) end - + + 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) + end + # Time Complexity: # Space Complexity: def postorder - raise NotImplementedError + postorder_helper(@root, []) end - + + 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} + end + # Time Complexity: # Space Complexity: def height - raise NotImplementedError + return 0 if @root.nil? + + height_helper(@root, 0) + end + + def height_helper(current, height) + return height if current.nil? + + height +=1 + left = height_helper(current.left, height) + right = height_helper(current.right, height) + + if left > right + return left + else + return right + end end - # Optional Method # Time Complexity: # Space Complexity: def bfs raise NotImplementedError end - + # Useful for printing def to_s return "#{self.inorder}" From 35b5b4434c9252933df0d9ffafd9ea6778d2922c Mon Sep 17 00:00:00 2001 From: Alice Date: Thu, 27 Feb 2020 12:42:04 -0800 Subject: [PATCH 2/2] i forgot to save --- lib/tree.rb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index fc97dd8..ec3c845 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,8 +16,8 @@ def initialize @root = nil end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(log n) for a balanced tree, O(n) for unbalanced + # Space Complexity: O(log n) for a balanced tree, O(n) for unbalanced def add(key, value) if @root.nil? @root = TreeNode.new(key, value) @@ -39,8 +39,8 @@ def add_helper(current, key, value) return current end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(log n) for a balanced tree, O(n) for unbalanced + # Space Complexity: O(log n) for a balanced tree, O(n) for unbalanced def find(key) return nil if @root.nil? @@ -60,8 +60,8 @@ def find_helper(current, key) end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def inorder inorder_helper(@root, []) end @@ -74,8 +74,8 @@ def inorder_helper(current, list) inorder_helper(current.right, list) end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def preorder preorder_helper(@root, []) end @@ -88,8 +88,8 @@ def preorder_helper(current, list) preorder_helper(current.right, list) end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def postorder postorder_helper(@root, []) end @@ -102,8 +102,8 @@ def postorder_helper(current, list) list << {key: current.key, value: current.value} end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def height return 0 if @root.nil?