Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中遍历泛型Trie_Java_Generics_Trie_Tree Traversal - Fatal编程技术网

在Java中遍历泛型Trie

在Java中遍历泛型Trie,java,generics,trie,tree-traversal,Java,Generics,Trie,Tree Traversal,我有一个用java完全构建的通用Trie。我试图遍历Trie以获得每条路径的所有完整组合。例如,如果Trie包含字符,那么它将返回所有单词组合。出于我的目的,我尝试将每个组合的所有节点放入一个数组中并返回它们。然而,我被难住了。在返回到父节点/起始节点(非常类似于BST遍历)之前,我只提出了遍历每个子节点(+子节点)的方法。我正在使用ArrayList来保存每个节点的子节点。如果有点混乱,很抱歉。代码示例或伪代码将非常受欢迎。谢谢 编辑 通过组合,我指的是以下内容。如果我有一个Trie,它看起来

我有一个用java完全构建的通用Trie。我试图遍历Trie以获得每条路径的所有完整组合。例如,如果Trie包含字符,那么它将返回所有单词组合。出于我的目的,我尝试将每个组合的所有节点放入一个数组中并返回它们。然而,我被难住了。在返回到父节点/起始节点(非常类似于BST遍历)之前,我只提出了遍历每个子节点(+子节点)的方法。我正在使用
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);
    }
  }
}
有了它,您将有一个堆栈的返回值,该堆栈由每个组合的值列表组成


希望这有帮助。:)

@AlexR
Trie
不是打字错误。请参见是否在每个节点中都有所需的字符或仅在叶节点中?每个节点中都有“数据点”(不需要是字符)。这会为每个路径创建单独的组合吗?另外,我使用的是泛型,而不是char,但我认为方法将保持不变。代码实际上更像类似java的伪代码:),因此,如果您想更改类型,它是相同的。我不明白单独的组合。你的意思是在同一棵树上运行两次吗?我必须更改所有代码以匹配你的问题。这应该可以回答您的问题。:)