实现树迭代器

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"

任何人都可以帮我吗?

Ken*_*urt 6

如果我可以提出更惯用的方法:

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风格.