繁体   English   中英

BFS - 树遍历

[英]BFS - TreeTraversal

我有以下员工数组,我正尝试使用 BFS 方法遍历这些员工。

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

该数组未排序,但它表示公司中的经理树。 对于数组中的每个项目,索引 0 是经理,而索引 1 和 2 是经理的下属。 基本上,它是一棵看起来像这样的树:

              alice
            /       \
         bob         joseph
        /   \         /    \
     tom  richard  elaine  albert
          /   \            /  \
   michelle   amy      colin  liam

我们的 output 应该完全匹配:

确切的 Output 需要:

alice
bob joseph
tom richard elaine albert
michelle amy colin liam

我试过这个但它只显示节点。

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

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

我将从将数组变成实际的树结构开始。 例如,您可以有一个Node class,它有一个name (例如"alice" )和一个leftright属性,指的是子节点:

Node = Struct.new(:name, :left, :right)

要填充节点,我们可以使用助手 hash:

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=... >

现在,要以广度优先的方式遍历(并打印)这棵树,我们可以使用如下代码:

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)

这个想法是构建最顶层的“行”,它只是我们的根节点: [node] 然后我们打印行的名称并从当前行right left节点创建后续行。 我们重复直到用完节点,即row变空。

Output:

alice
bob joseph
tom richard elaine albert
michelle amy colin liam

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM