【问题标题】:BFS - TreeTraversalBFS - 树遍历
【发布时间】:2020-10-08 08:37:23
【问题描述】:

我尝试使用 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

我们的输出应该完全匹配:

需要的确切输出:

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

【问题讨论】:

    标签: ruby data-structures tree traversal tree-traversal


    【解决方案1】:

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

    我首先将数组转换为实际的树结构。例如,您可以有一个 Node 类,其中包含 name(例如 "alice")和 leftright 属性,指的是子节点:

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

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

    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]。然后我们打印行的名称并从当前行的leftright 子节点创建后续行。我们重复直到我们用完节点,即row 变为空。

    输出:

    alice
    bob joseph
    tom richard elaine albert
    michelle amy colin liam
    

    【讨论】:

    • 如果经理管理三个或更多员工怎么办?为什么要使用这个Node 类而不是直接在树上执行 BFS?
    • @Stef 我已经介绍了Node 具有实际的树结构。二维数组不是树。关于多名员工:我想让代码保持简单。您可以轻松地将其扩展为具有任意数量的子节点,例如row = row.flat_map(&amp;:child_nodes).compact
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2017-10-29
    • 2016-09-25
    相关资源
    最近更新 更多