2009-02-01 63 views
3

我正在写一个Ruby脚本,并想用一个N叉树数据结构的“红宝石”的方式。做一个N叉树

是否有一个良好的实现,可以作为源代码?谢谢。

回答

11

为了扩大对奥托的回答,得到一个哈希以一个简单的方法自动vivify阵列是使用默认值块与Hash::new,就像这样:

node_children = Hash.new { |_node_children, node_key| _node_children[node_key] = [] } 

但实际上,该代码取决于什么你想用你的数组。您可以 设置它们与散列和数组,或做一些类:

class Node 
    attr_accessor :value, :children 
    def initialize(value, children=[]) 
     @value = value 
     @children = children 
    end 
    def to_s(indent=0) 
     value_s = @value.to_s 
     sub_indent = indent + value_s.length 
     value_s + @children.map { |child| " - " + child.to_s(sub_indent + 3) }.join("\n" + ' ' * sub_indent) 
    end 
end 

ROOT = Node.new('root', %w{ farleft left center right farright }.map { |str| Node.new(str) }) 
puts "Original Tree" 
puts ROOT 
puts 

ROOT.children.each do |node| 
    node.children = %w{ one two three four }.map { |str| Node.new(node.value + ':' + str) } 
end 
puts "New Tree" 
puts ROOT 
puts 

此代码,例如,给出了:

Original Tree 
root - farleft 
    - left 
    - center 
    - right 
    - farright 

New Tree 
root - farleft - farleft:one 
       - farleft:two 
       - farleft:three 
       - farleft:four 
    - left - left:one 
      - left:two 
      - left:three 
      - left:four 
    - center - center:one 
       - center:two 
       - center:three 
       - center:four 
    - right - right:one 
      - right:two 
      - right:three 
      - right:four 
    - farright - farright:one 
       - farright:two 
       - farright:three 
       - farright:four 
5

A散列其属性都是阵列?