Ruby BFS-三层结构

Ruby BFS-三层结构,ruby,data-structures,tree,traversal,tree-traversal,Ruby,Data Structures,Tree,Traversal,Tree Traversal,我有以下一组员工,我正试图使用BFS方法遍历这些员工 array = [ ["alice", "bob", "joseph"], ["bob", "tom", "richard"], ["richard", "michelle", "amy"], ["joseph", "e

我有以下一组员工,我正试图使用BFS方法遍历这些员工

array = [
  ["alice", "bob", "joseph"],
  ["bob", "tom", "richard"],
  ["richard", "michelle", "amy"],
  ["joseph", "elaine", "albert"],
  ["albert", "colin", "liam"]
]
此数组未排序,但它表示公司中的经理树。 对于数组中的每个项目,索引0是经理,而索引1和2是经理的下属。 基本上,它是一棵看起来像这样的树:

def traverse(node)
  row = [node]
  until row.empty?
    puts row.map(&:name).join(' ')
    row = row.flat_map { |n| [n.left, n.right] }.compact
  end
end

traverse(root)
爱丽丝 / \ 鲍勃·约瑟夫 / \ / \ 汤姆·理查德·伊莱恩·艾伯特 / \ / \ 米歇尔·艾米·科林·利亚姆 我们的输出应与此完全匹配:

所需的确切输出:

爱丽丝 鲍勃·约瑟夫 汤姆·理查德·伊莱恩·艾伯特 米歇尔·艾米·科林·利亚姆 我已经试过了,但它只显示节点

array = [
    ["alice", "bob", "joseph"],
    ["bob", "tom", "richard"],
    ["richard", "michelle", "amy"],
    ["joseph", "elaine", "albert"],
    ["albert", "colin", "liam"]
]

new_array = Array.new

def treverse(array,new_array)
    final_array = Array.new
    arr = array.shift
    i = true
    arr.each do |b|
        unless new_array.include?(b)
            
            new_array.push(b)
        end
        array.each do |c|
            if c.include?(b)
                treverse(array, new_array)
            end
        end
    end
    return 
end

treverse(array,new_array)

new_array.each do |p|
    puts p
end

我不确定您是否可以仅在给定的数组上执行此操作

我首先将数组转换为实际的树结构。例如,您可以有一个
节点
类,该类具有
名称
(例如
“alice”
)和
属性,引用子节点:

Node = Struct.new(:name, :left, :right)
要填充节点,我们可以使用助手哈希:

nodes = Hash.new { |h, k| h[k] = Node.new(k) }
array.each do |name, left, right|
  nodes[name].left = nodes[left]
  nodes[name].right = nodes[right]
end

root = nodes['alice']
#=> #<struct Node name="alice", left=#<struct Node name="bob" ...>, right=... >
其思想是构造最顶层的“行”,它只是我们的根节点:
[node]
。然后,我们打印行的名称,并从当前行的
子节点创建后续行。我们重复,直到节点用完,即
变为空

输出:

爱丽丝 鲍勃·约瑟夫 汤姆·理查德·伊莱恩·艾伯特 米歇尔·艾米·科林·利亚姆
如果一名经理管理三名或三名以上员工,该怎么办?为什么要使用这个
节点
类,而不是直接在树上执行BFS呢?@Stef我已经介绍了
节点
以具有实际的树结构。二维数组不是树。关于多个员工:我希望代码保持简单。您可以轻松地将其扩展为具有任意数量的子节点,例如
row=row.flat\u map(&:child\u节点)。compact