我现在正在寻找一种方法,它给了我一棵树的所有路径。想象一下下面的树:
A
B
C
D
E
F
G
现在我希望将所有路径作为单独的String:
---------------更新-----------------
正如评论中已经提到的,我正在寻找所有树路径而不是子树。 我找到了以下解决方案,但我不确定它是否会是一个好的解决方案:
private ArrayList<ArrayList<String>> abstractProperties;
........
getTreePath(abstractHw, new ArrayList<String>());
.......
private void getTreePath(Node hw, ArrayList<String> path) {
path.add(hw.getName());
if (hw.getNodes().isEmpty()) {
abstractProperties.add(path);
} else {
for (Node subHw : hw.Nodes()) {
getTreePath(subHw, new ArrayList<String>(path));
}
}
}
您怎么看?
答案 0 :(得分:0)
您可以使用BFS算法(维基百科上解释的图算法),从您想要创建根节点开始。
算法的行为如下:
procedure BFS(G,v,btree):
create a queue Q
enqueue v onto Q
mark v
btree = new Tree(v);//Create a tree structure with v as root
while Q is not empty:
t ← Q.dequeue()
btree.add(t) // Here its where you add elements to your tree
for all edges e in G.incidentEdges(t) do
o ← G.opposite(t,e)
if o is not marked:
mark o
enqueue o onto Q
当Q为空时表示您处理了所有可能的节点,并且所有节点都已添加到二叉树(btree)中。
一旦你有了btree,你可以应用任何简单的算法来获得你需要的东西
答案 1 :(得分:0)
您实现树(或更准确地说,节点)需要能够返回他们是否有孩子。
如果您想要更详细的答案显示您尝试过的内容,并告诉我们您如何存储树。
答案 2 :(得分:0)
这就是我能够在任意树结构中打印叶节点的完整路径的方法:
<script>
function factory(name, children) {
return {
name: name,
children: children
}
}
var paths = [];
function getGroupPaths(node, path) {
path.push(node.name);
if (node.children.length == 0) {
console.log(path.join());
} else {
for (child of node.children) {
getGroupPaths(child, path);
}
}
path.pop();
}
var acca = factory('acca', []);
var accb = factory('accb', []);
var accc = factory('accc', []);
var aca = factory('aca', []);
var acb = factory('acb', []);
var acc = factory('acc', [acca, accb, accc]);
var aa = factory('aa', []);
var ab = factory('ab', []);
var ac = factory('ac', [aca, acb, acc]);
var ad = factory('ad', []);
var a = factory('a', [aa, ab, ac, ad]);
var path = [];
getGroupPaths(a, path);
</script>
结果:
A,AA
A,AB
一个,AC,ACA
一个,AC,ACB
一个,AC,ACC,ACCA
一个,AC,ACC,ACCB
一个,AC,ACC,ACCC
一个,广告