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