I have the following class called Tree that builds a simple tree
class Tree
attr_accessor :children, :node_name
def initialize(name, children=[])
@children = children
@node_name = name
end
def visit_all(&block)
visit &block
children.each {|c| c.visit_all &block}
end
def visit(&block)
block.call self
end
end
ruby_tree = Tree.new("grandpa",
[Tree.new("dad", [Tree.new("child1"), Tree.new("child2")]),
Tree.new("uncle", [Tree.new("child3"), Tree.new("child4")])])
puts "Visiting a node"
ruby_tree.visit {|node| puts node.node_name}
puts
puts "visiting entire tree"
ruby_tree.visit_all {|node| puts node.node_name}
Now what I am trying to do is to be able to create a tree as nested hashes instead. For example, for this one this would be:
{‘grandpa’=>{‘dad’=>{‘child 1’=>{},’child 2’=>{}}, ‘uncle’=>{‘child 3’=>{}, ‘child 4’=>{}}}}
Any ideas that could help?
It was melting my brain so I wrote a spec for it:
I’m certain this could be done better, but it works at least.
Btw, the hash you provided has some extra spaces in it that I don’t think should be there? e.g. “child 1” when it should be “child1”, unless you really want that added in?