BST = Struct.new(:data, :left, :right) do def insert(new_data) new_data > self.data ? input(:right, new_data) : input(:left, new_data) end def input(side, new_data) self[side] ? self[side].insert(new_data) : self[side] = BST.new(new_data) end def each(&block) self.left.each(&block) if self.left yield self.data self.right.each(&block) if self.right end end