main
 1require_relative "../utility/block_visitor"
 2require_relative "../utility/total_count_visitor"
 3require_relative "../pre_order_traversal"
 4
 5class BinaryTree
 6  def push(item)
 7    @root.push(item) if @root
 8    @root = BinaryTreeNode.new(item) unless @root
 9  end
10
11  def size
12    visitor = TotalCountVisitor.new
13    accept(visitor)
14    visitor.result
15  end
16
17  def accept(visitor, traversal = PreOrderTraversal.new)
18    @root.accept(visitor, traversal) if @root
19  end
20
21  def each(&block)
22    accept(BlockVisitor.new(&block))
23  end
24
25  class BinaryTreeNode
26    attr_reader :left, :right, :data
27
28    def initialize(data)
29      @data = data
30    end
31
32    def push(item)
33      if (item <=> @data) == -1
34        @left.push(item) if @left
35        @left = BinaryTreeNode.new(item) unless @left
36      else
37        @right.push(item) if @right
38        @right = BinaryTreeNode.new(item) unless @right
39      end
40    end
41
42    def accept(visitor, traversal)
43      traversal.traverse(self, visitor)
44    end
45  end
46end