在Java中遍历泛型Trie
我有一个用java完全构建的通用Trie。我试图遍历Trie以获得每条路径的所有完整组合。例如,如果Trie包含字符,那么它将返回所有单词组合。出于我的目的,我尝试将每个组合的所有节点放入一个数组中并返回它们。然而,我被难住了。在返回到父节点/起始节点(非常类似于BST遍历)之前,我只提出了遍历每个子节点(+子节点)的方法。我正在使用在Java中遍历泛型Trie,java,generics,trie,tree-traversal,Java,Generics,Trie,Tree Traversal,我有一个用java完全构建的通用Trie。我试图遍历Trie以获得每条路径的所有完整组合。例如,如果Trie包含字符,那么它将返回所有单词组合。出于我的目的,我尝试将每个组合的所有节点放入一个数组中并返回它们。然而,我被难住了。在返回到父节点/起始节点(非常类似于BST遍历)之前,我只提出了遍历每个子节点(+子节点)的方法。我正在使用ArrayList来保存每个节点的子节点。如果有点混乱,很抱歉。代码示例或伪代码将非常受欢迎。谢谢 编辑 通过组合,我指的是以下内容。如果我有一个Trie,它看起来
ArrayList
来保存每个节点的子节点。如果有点混乱,很抱歉。代码示例或伪代码将非常受欢迎。谢谢
编辑
通过组合,我指的是以下内容。如果我有一个Trie
,它看起来如下所示:
"null"
/ | \
a i t
/ /|\ \
t f m n o
我希望返回的组合为:
[a, t]
[i, f]
[i, m]
[i, n]
[t, o]
所有这些数组/列表都可以放在一个ArrayList中,并在最后返回。使用递归方法(至少)获取树中的所有字符。只需确保将字符初始化为空列表即可
Stack startRead(Tree tree) {
// validation check
if (tree == null || !tree.hasChild()) return null;
// create Stack to store the lists
Stack listStack = new Stack();
// for every child
List children = tree.getChildren();
for (Tree child : children) {
// create a list
List childList = new ArrayList();
// store (push) it into stack
listStack.push(childList);
// call the recursive
readIt(child, listStack);
}
return listStack;
}
void readIt(Tree tree, Stack listStack) {
// pick the top list from stack
List current = (List) listStack.pop();
// this is the base; if tree has no child don't call this method again.
if (!tree.hasChild()) {
// if it's leaf add the value to current list
current.add(tree.getValue());
// push it back to stack
listStack.push(current);
} else {
// for every child
List children = tree.getChildren();
for (Tree child : children) {
// IMPORTANT! clone the list (if this fails, clone it yourself)
// clone is called when the tree is branching
List childList = current.clone();
// insert this tree value to list
childList.add(tree.getValue());
// push it back
listStack.push(childList);
// call again
readIt(child, listStack);
}
}
}
有了它,您将有一个堆栈的返回值,该堆栈由每个组合的值列表组成
希望这有帮助。:) @AlexRTrie
不是打字错误。请参见是否在每个节点中都有所需的字符或仅在叶节点中?每个节点中都有“数据点”(不需要是字符)。这会为每个路径创建单独的组合吗?另外,我使用的是泛型,而不是char,但我认为方法将保持不变。代码实际上更像类似java的伪代码:),因此,如果您想更改类型,它是相同的。我不明白单独的组合。你的意思是在同一棵树上运行两次吗?我必须更改所有代码以匹配你的问题。这应该可以回答您的问题。:)