根据维基百科,关于特里:
一组密钥的字典排序可以通过简单的基于特里的算法完成,如下所示:
- 将所有密钥插入路径。
- 通过预订遍历输出特里结构中的所有键,从而使输出按字典顺序递增。
但是,这是我使用标准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
'词典排序'是什么意思?输出顺序似乎与插入顺序更相关,而不是字典顺序。我弄错了吗? 以这棵树为例,预购打印输出将是“以茶为特色的一家酒店”。字典顺序在哪里?
答案 0 :(得分:1)
关于使用尝试进行词典排序的正确方法是:
trie中节点的前序与它们所代表的字符串的词典顺序相同,假设节点的子节点由边标签排序。
现在,如果你在代码中尝试了这个,那么预先遍序遍历应该按照字典顺序给你字符串。
以下是一个示例:http://www.cs.helsinki.fi/u/tpkarkka/opetus/12s/spa/lecture02.pdf
的参考答案 1 :(得分:0)
据我说,它应该是Inorder
遍历。可以遍历特里使得具有小于根值的键的所有分支首先被处理,然后打印根值,并且最后所有值都大于根值。这是标准 inorder
遍历,但我想要做的唯一一点是,你必须编写自定义逻辑来处理所有分支的密钥首先小于root的密钥,在一个普通的二叉树中,它只是root.left,但由于在trie中没有左/右,我们必须回到BST中左右的本质。(其顺序也按字典顺序排序)价值观。)