From a947020908f30015f38401716fa42d9108e9b83c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannah=20Teki=C3=A9?= Date: Tue, 29 Sep 2020 22:08:24 -0700 Subject: [PATCH] all test passed --- lib/tree.rb | 125 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 102 insertions(+), 23 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..e594dfb 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -1,62 +1,141 @@ +require "pry" + 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 attr_reader :root + def initialize @root = nil end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(Log n) + # Space Complexity: O(1) def add(key, value) - raise NotImplementedError + new_node = TreeNode.new(key, value) + if !@root + @root = new_node + return + end + current = @root + while current != nil + if key < current.key + if current.left + current = current.left + else + current.left = new_node + return + end + else + if current.right + current = current.right + else + current.right = new_node + return + end + end + end end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(Log n) + # Space Complexity: O(1) def find(key) - raise NotImplementedError + current = @root + while current != nil + if key == current.key + return current.value + elsif key < current.key + current = current.left + else + current = current.right + end + end + return nil end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(Log n) + # Space Complexity: O(n) def inorder - raise NotImplementedError + ary = [] + + def innerfunc(node, ary) + return if node.nil? + innerfunc(node.left, ary) + ary << { :key => node.key, :value => node.value } + innerfunc(node.right, ary) + end + + innerfunc(@root, ary) + return ary end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(Log n) + # Space Complexity: O(n) def preorder - raise NotImplementedError + ary = [] + + def innerfunc(node, ary) + return if node.nil? + ary << { :key => node.key, :value => node.value } + innerfunc(node.left, ary) + innerfunc(node.right, ary) + end + + innerfunc(@root, ary) + return ary end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(Log n) + # Space Complexity: O(n) + def postorder - raise NotImplementedError + ary = [] + def innerfunc(node, ary) + return if node.nil? + innerfunc(node.left, ary) + innerfunc(node.right, ary) + ary << { :key => node.key, :value => node.value } + end + + innerfunc(@root, ary) + return ary end - # Time Complexity: - # Space Complexity: + # Time Complexity: + # Space Complexity: def height - raise NotImplementedError + def innerfunc(node) + return 0 if node.nil? + return 1 if !node.left && !node.right + return [innerfunc(node.left) + 1, innerfunc(node.right) + 1].max + end + + return innerfunc(@root) end # Optional Method - # Time Complexity: - # Space Complexity: + # Time Complexity: + # Space Complexity: def bfs - raise NotImplementedError + q = [@root] + ary = [] + while !q.empty? + current = q.pop + q << current.left if current.left + q << current.right if current.right + ary << { :key => current.key, :value => current.value } + end + return ary end # Useful for printing