class Tree attr_accessor :value, :left, :right def initialize(value, left=nil, right=nil) @value = value @left = left @right = right end def each_node(&block) block.call(@value) @left.each_node(&block) if @left @right.each_node(&block) if @right end def method_missing(method_name, *args) method_name = method_name.to_s path = method_name.scan(/(left|right)/).flatten current_node = self path.each do |direction| if direction == "left" current_node = current_node.left elsif direction == "right" current_node = current_node.right end return nil if current_node.nil? end return current_node.value super end end my_tree = Tree.new(42, Tree.new(3, Tree.new(1, Tree.new(7, Tree.new(22), Tree.new(123)), Tree.new(32))), Tree.new(99, Tree.new(81))) my_tree.each_node do |v| puts v end arr = [] my_tree.each_node do |v| arr.push v end p arr p "Getting nodes from tree" p my_tree.left_left p my_tree.right_left p my_tree.left_left_right p my_tree.left_left_left_right