0 ruby algorithm tree binary-tree traversal
我创建了一个非常简单的节点类,其中包含名称和节点数组.我还创建了一个迭代器类,其下一个方法可以帮助我迭代每个节点和子节点.我需要编写下一个方法,但我不知道最好的方法是什么.
class Node
def initialize(name, nodes
@name = name
@nodes = nodes
end
end
class Iterator
def initialize(node)
@node = node
end
def next
???
end
end
Run Code Online (Sandbox Code Playgroud)
例:
z = Node.new("z", [])
b = Node.new("b", [z])
c = Node.new("c", [])
parent = Node.new("a", [b, c])
iterator = Iterator.new(parent)
str = ''
next = iterator.next
while next do
str += next.name
next = iterator.next
end
Run Code Online (Sandbox Code Playgroud)
str应该等于"abzc"
任何人都可以帮我吗?
如果我可以提出更惯用的方法:
class Node
attr_accessor :name, :children
def initialize(name, children = [ ])
@name = name
@children = children
end
def traverse(&block)
yield self
@children.each { |child| child.traverse(&block) }
end
end
z = Node.new("z")
b = Node.new("b", [z])
c = Node.new("c")
parent = Node.new("a", [b, c])
str = ''
parent.traverse { |node| str += node.name }
puts str
Run Code Online (Sandbox Code Playgroud)
这比btilly的解决方案(这也是正确的)有一个好处,因为它不会扩散Iterator对象并吸收内存 - 实际上Iterator从实现中消失(同时仍然保持对每个节点连续执行某些操作的能力).这更加惯用; 更多Ruby风格.