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