【发布时间】:2014-02-20 04:43:32
【问题描述】:
根据维基百科,关于特里:
一组键的字典排序可以通过一个简单的基于trie的算法来完成,如下所示:
- 在 trie 中插入所有键。
- 通过前序遍历的方式输出 trie 中的所有键,这导致输出按字典顺序递增。
但是,这是我对标准 trie 实现的测试:
Trie trie = new Trie();
trie.add("doll");
trie.add("ball");
trie.add("bat");
trie.add("dork");
trie.add("dorm");
trie.add("send");
trie.add("sense");
trie.add("sent");
预购打印输出:
public List<String> allWords(){
List<String> words = new ArrayList<String>();
if(root == null){
return words;
}
StringBuilder prefix = new StringBuilder();
getAllWords(root.children,prefix,words);
return words;
}
// depth first search
private void getAllWords(List<TrieNode> children, StringBuilder prefix, List<String> words){
for(int i= 0; i<children.size(); i++){
TrieNode child = children.get(i);
if(!child.isWord_){
prefix.append(child.data_);
allWordsHelper(child.children, prefix, words);
}else{
prefix.append(child.data_);
words.add(prefix.toString());
}
prefix.deleteCharAt(prefix.length()-1);
}
}
而输出顺序为:doll dork dorm ball bat send sense sent
“字典排序”是什么意思?似乎输出顺序与插入顺序更相关,而不是字典顺序。我有什么问题吗? 以这棵树为例,预购打印输出将是“toteated 10 a inn”。字典顺序在哪里?
【问题讨论】:
-
打印输出时是否进行了预购遍历?
-
是的,预购。由于“娃娃”是先插入的,因此即使在预订时也必须先输出。在根下,第一级字符是'd b s'。通过预购,它首先打印所有带有 'd' 前缀的单词。
-
想想标准的 Trie 数据结构和上面描述的两步算法,没有任何信息可以保证字典顺序。这怎么可能?
-
如果您进行中序遍历并按排序顺序访问每个节点的子节点,您应该按排序顺序取回所有元素。您能否向我们展示您用于中序遍历和将节点存储在 trie 中的代码?
-
但是wiki说实现词典排序是预购的。