问题描述
我尝试使用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