You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
812 B
47 lines
812 B
class BinarySearchTree
|
|
include Enumerable
|
|
|
|
class Node
|
|
attr_accessor :student, :left, :right
|
|
|
|
def initialize(student)
|
|
@student = student
|
|
@left = nil
|
|
@right = nil
|
|
end
|
|
end
|
|
|
|
def initialize
|
|
@root = nil
|
|
end
|
|
|
|
def add(student)
|
|
@root = insert(@root, student)
|
|
end
|
|
|
|
def each(&block)
|
|
in_order_traversal(@root, &block)
|
|
end
|
|
|
|
private
|
|
|
|
def insert(node, student)
|
|
return Node.new(student) if node.nil?
|
|
|
|
if student.birth_date < node.student.birth_date
|
|
node.left = insert(node.left, student)
|
|
else
|
|
node.right = insert(node.right, student)
|
|
end
|
|
node
|
|
end
|
|
|
|
def in_order_traversal(node, &block)
|
|
return if node.nil?
|
|
|
|
in_order_traversal(node.left, &block)
|
|
yield node.student
|
|
in_order_traversal(node.right, &block)
|
|
end
|
|
end
|