57 lines
1.3 KiB
Ruby
57 lines
1.3 KiB
Ruby
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
|