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

我们的输出应与此完全匹配:

需要精确的输出

alice
bob joseph
tom richard elaine albert
michelle amy colin liam

我已经尝试过了,但是只显示了节点。

array = [
    ["alice","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

解决方法

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

我将从将数组变成实际的树结构开始。例如,您可以拥有一个<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.aade.gr/myDATA/invoice/v1.0" xmlns:a="http://www.aade.gr/myDATA/invoice/v1.0" xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0" xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0" exclude-result-prefixes="a"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="a:issuer | a:counterpart | a:invoiceHeader | a:paymentMethodDetails | a:invoiceDetails | a:invoiceSummary"> <xsl:copy> <xsl:copy-of select="/a:RequestedDoc/a:invoicesDoc/a:invoice/a:uid"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> </xsl:stylesheet> 类,该类带有一个Node(例如name)以及一个"alice"left属性,引用子节点:>

right

要填充节点,我们可以使用辅助哈希:

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]left子节点创建后续行。重复直到节点用完为止,即right为空。

输出:

row