Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Laneia #30

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
130 changes: 103 additions & 27 deletions lib/tree.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,137 @@ 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

def add(key, value)
if key == @key
return
elsif key < @key
left.nil? ? @left = TreeNode.new(key, value) : left.add(key, value)
elsif key > @key
right.nil? ? @right = TreeNode.new(key, value) : right.add(key, value)
end
end

def find(key)
if key == @key
return @value
elsif key < @key
left.nil? ? nil : left.find(key)
elsif key > @key
right.nil? ? nil : right.find(key)
end
end

def inorder(array)
left.inorder(array) unless left.nil?
array << {key: @key, value: @value}
right.inorder(array) unless right.nil?
end

def preorder(array)
array << {key: @key, value: @value}

if left
left.preorder(array)
end

if right
right.preorder(array)
end
end

def postorder(array)
if left
left.postorder(array)
end

if right
right.postorder(array)
end
array << {key: @key, value: @value}
end
end

class Tree
attr_reader :root

def initialize
@root = nil
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(log n) if balanced tree, O(n) if unbalanced, n = # nodes in tree
# Space Complexity: O(log n) if balanced tree, O(n) if unbalanced, n = # nodes in tree

Choose a reason for hiding this comment

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

Yes since you're doing recursion

def add(key, value)
raise NotImplementedError
if root.nil?
@root = TreeNode.new(key, value)
else
root.add(key, value)
end
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(log n) if balanced tree, O(n) if unbalanced, n = # nodes in tree
# Space Complexity: O(log n) if balanced tree, O(n) if unbalanced, n = # nodes in tree
def find(key)
raise NotImplementedError
if root.nil?
return nil
else
root.find(key)
end
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n),n = # nodes in tree
# Space Complexity: O(n), n = # nodes in tree
def inorder
raise NotImplementedError
array = []
if root.nil?
return array
else
root.inorder(array)
return array
end
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n), n = # nodes in tree
# Space Complexity: O(n), n = # nodes in tree
def preorder
raise NotImplementedError
array = []
if root.nil?
return array
else
root.preorder(array)
return array
end
end

# Time Complexity:
# Space Complexity:
# Time Complexity: O(n), n = # nodes in tree
# Space Complexity: O(n), n = # nodes in tree
def postorder
raise NotImplementedError
array = []
if root.nil?
return array
else
root.postorder(array)
return array
end
end

# Time Complexity:
# Space Complexity:
def height
raise NotImplementedError
end
# Time Complexity: O(n), n = # nodes in tree
# Space Complexity: O(1)

Choose a reason for hiding this comment

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

Since this is recursive, you have the system stack being used here and the space complexity is O(Log n)

def height(current = @root)
if current
lh = height(current.left)
rh = height(current.right)

# Optional Method
# Time Complexity:
# Space Complexity:
def bfs
raise NotImplementedError
(lh > rh ? lh : rh) + 1
else
0
end
end

# Useful for printing
Expand Down
39 changes: 12 additions & 27 deletions test/tree_test.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
require_relative 'test_helper'

require_relative "test_helper"

Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new

describe Tree do
let (:tree) {Tree.new}
let (:tree) { Tree.new }

let (:tree_with_nodes) {
tree.add(5, "Peter")
Expand Down Expand Up @@ -37,23 +36,21 @@
end

it "will return the tree in order" do

expect(tree_with_nodes.inorder).must_equal [{:key=>1, :value=>"Mary"}, {:key=>3, :value=>"Paul"},
{:key=>5, :value=>"Peter"}, {:key=>10, :value=>"Karla"},
{:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}]
expect(tree_with_nodes.inorder).must_equal [{:key => 1, :value => "Mary"}, {:key => 3, :value => "Paul"},
{:key => 5, :value => "Peter"}, {:key => 10, :value => "Karla"},
{:key => 15, :value => "Ada"}, {:key => 25, :value => "Kari"}]
end
end


describe "preorder" do
it "will give an empty array for an empty tree" do
expect(tree.preorder).must_equal []
end

it "will return the tree in preorder" do
expect(tree_with_nodes.preorder).must_equal [{:key=>5, :value=>"Peter"}, {:key=>3, :value=>"Paul"},
{:key=>1, :value=>"Mary"}, {:key=>10, :value=>"Karla"},
{:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}]
expect(tree_with_nodes.preorder).must_equal [{:key => 5, :value => "Peter"}, {:key => 3, :value => "Paul"},
{:key => 1, :value => "Mary"}, {:key => 10, :value => "Karla"},
{:key => 15, :value => "Ada"}, {:key => 25, :value => "Kari"}]
end
end

Expand All @@ -63,12 +60,12 @@
end

it "will return the tree in postorder" do
expect(tree_with_nodes.postorder).must_equal [{:key=>1, :value=>"Mary"}, {:key=>3, :value=>"Paul"},
{:key=>25, :value=>"Kari"}, {:key=>15, :value=>"Ada"},
{:key=>10, :value=>"Karla"}, {:key=>5, :value=>"Peter"}]
expect(tree_with_nodes.postorder).must_equal [{:key => 1, :value => "Mary"}, {:key => 3, :value => "Paul"},
{:key => 25, :value => "Kari"}, {:key => 15, :value => "Ada"},
{:key => 10, :value => "Karla"}, {:key => 5, :value => "Peter"}]
end
end

describe "height" do
it "returns 0 for an empty tree" do
expect(tree.height).must_equal 0
Expand All @@ -78,16 +75,4 @@
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 []
end

it "will return an array of a level-by-level output of the tree" do
expect(tree_with_nodes.bfs).must_equal [{:key=>5, :value=>"Peter"}, {:key=>3, :value=>"Paul"},
{:key=>10, :value=>"Karla"}, {:key=>1, :value=>"Mary"},
{:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}]
end
end
end