Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 154 additions & 23 deletions lib/tree.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,192 @@ 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 h) if balanced
# Space Complexity: O(log h) id balanced
def add(key, value)
raise NotImplementedError
new_node = TreeNode.new(key, value)
if @root.nil?
@root = new_node
else
add_helper(@root, new_node)
end
end

def add_helper(current, new_node)
if new_node.key <= current.key
if current.left
add_helper(current.left, new_node)
else
current.left = new_node
end
else
if current.right
add_helper(current.right, new_node)
else
current.right = new_node
end
end
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(log h) if balanced
# Space Complexity: O(1)
def find(key)
raise NotImplementedError
return nil if @root.nil?
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
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n^2)
# Space Complexity: O(n)
def inorder
raise NotImplementedError
current = root
stack = []
output = []
while current || !stack.empty?
while !current.nil?
stack.push(current)
current = current.left
end
current = stack.pop
new_hash = Hash.new
new_hash[:key] = current.key
new_hash[:value] = current.value
output.push(new_hash); #storing the data
current = current.right
end
return output
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(log n) if balanced
# Space Complexity: O(h)
def preorder
raise NotImplementedError
#raise NotImplementedError
stack = []
output = []
current = @root
return [] if current.nil?
stack.push(current)
while !stack.empty?
current = stack.pop()
new_hash = Hash.new
new_hash[:key] = current.key
new_hash[:value] = current.value
output.push(new_hash)
if current.right
stack.push(current.right)
end
if current.left
stack.push(current.left)
end
end
return output
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(log h) if balanced
# Space Complexity: O(h)
def postorder
raise NotImplementedError
#raise NotImplementedError
stack = []
output = []
return [] if @root.nil?
stack.push(@root)
while !stack.empty?
current = stack.pop()
new_hash = Hash.new
new_hash[:key] = current.key
new_hash[:value] = current.value
output.push(new_hash)
if current.left
stack.push(current.left)
end
if current.right
stack.push(current.right)
end
end
return output.reverse
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n)
# Space Complexity: O(h)
def height
raise NotImplementedError
#raise NotImplementedError

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice try at an iterative solution. It's easier to do recursively. This solution doesn't work.

Remember the height of a subtree is the max of the height of the left subtree compared to the height of the right subtree plus one.

stack = []
current = @root
stack.push(current)
count_left = 0
count_right = 0
max_count = 0
while !stack.empty?
current = stack.pop
if current.left
count_left += 1
stack.push(current.left)
else
if count_left > max_count
max_count = count_left
count_left = 0
end
end
if current.right
count_right += 1
stack.push(current.right)
else
if count_right > max_count
max_count = count_right
count_right = 0
end
end
end
return max_count
end

# Optional Method
# Time Complexity:
# Space Complexity:
# Time Complexity: O(log h) if balanced

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since you are building a Queue and sift the 1st element of the queue off at each iteration, this is O(n2)

Also since you are building an array, the space complexity is O(n)

# Space Complexity: O(h)
def bfs
raise NotImplementedError
#raise NotImplementedError
return [] if @root.nil?
queue = []
output = []
queue.push(@root)
while !queue.empty?
current = queue[0]
new_hash = Hash.new
new_hash[:key] = current.key
new_hash[:value] = current.value
output.push(new_hash)
if current.left
queue.push(current.left)
end
if current.right
queue.push(current.right)
end
queue = queue[1..-1]
end
return output
end

# Useful for printing
Expand Down