Skip to content
Open
Show file tree
Hide file tree
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
126 changes: 105 additions & 21 deletions lib/tree.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,47 +16,131 @@ def initialize
@root = nil
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(h), where h is the maximum height of the binary tree.
# In a balanced tree, this would be O(log n)
# Space Complexity: O(1), the method will always create one(1) new node
def add(key, value)
raise NotImplementedError
new_node = TreeNode.new(key, value)
if !@root
@root = new_node
return
end
current = @root
while current
if key <= current.key
if current.left
current = current.left
else
current.left = new_node
break
end
else
if current.right
current = current.right
else
current.right = new_node
break
end
end
end
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(h), where h is the maximum height of the binary tree.
# In a balanced tree, this would be O(log n)
# Space Complexity: O(1), no new nodes are created
def find(key)
raise NotImplementedError
current = @root
while current
if key == current.key
return current.value
elsif key < current.key
current = current.left
else
current = current.right
end
end
return
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n) where n is the number of nodes
# Space Complexity: O(n) where n is the number of nodes
def inorder
raise NotImplementedError
nodes = []
if @root
add_nodes_inorder(root, nodes)
end
return nodes
end

# Time Complexity:
# Space Complexity:
def add_nodes_inorder(node, array)
return if !node
add_nodes_inorder(node.left, array)
array << { key: node.key, value: node.value }
add_nodes_inorder(node.right, array)
end

# Time Complexity: O(n) where n is the number of nodes
# Space Complexity: O(n) where n is the number of nodes
def preorder
raise NotImplementedError
nodes = []
if @root
add_nodes_preorder(root, nodes)
end
return nodes
end

def add_nodes_preorder(node, array)
return if !node
array << { key: node.key, value: node.value }
add_nodes_preorder(node.left, array)
add_nodes_preorder(node.right, array)
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n) where n is the number of nodes
# Space Complexity: O(n) where n is the number of nodes
def postorder
raise NotImplementedError
nodes = []
if @root
add_nodes_postorder(root, nodes)
end
return nodes
end

# Time Complexity:
# Space Complexity:
def add_nodes_postorder(node, array)
return if !node
add_nodes_postorder(node.left, array)
add_nodes_postorder(node.right, array)
array << { key: node.key, value: node.value }
end

# Time Complexity: O(n) where n is the number of nodes
# Space Complexity: O(n) where n is the number of nodes
def height
raise NotImplementedError
return max_depth(@root)
end

def max_depth(node)
return 0 if !node
right = max_depth(node.right)
left = max_depth(node.left)
return [right, left].max + 1
end
# Optional Method
# Time Complexity:
# Space Complexity:
# Time Complexity: O(n) where n is the number of nodes
# Space Complexity: O(n) where n is the number of nodes
def bfs
raise NotImplementedError
return [] if !@root
queue = []
nodes = []

queue.push(@root)

Choose a reason for hiding this comment

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

Nice use of the Queue!

while !queue.empty?
current = queue.shift
nodes << { key: current.key, value: current.value }
queue.push(current.left) if current.left
queue.push(current.right) if current.right
end
return nodes
end

# Useful for printing
Expand Down
10 changes: 10 additions & 0 deletions test/tree_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,16 @@
end
end

describe "height" do
it "will return 0 for an empty tree" do
expect(tree.height).must_equal 0
end

it "will return the number of edges from the root to the deepest leaf" do
expect(tree_with_nodes.height).must_equal 4
end
end

describe "breadth first search" do
it "will give an empty array for an empty tree" do
expect(tree.bfs).must_equal []
Expand Down