我有三元搜索树( Trie ),我想打印出其中的所有字词。
我如何使用下面的当前实现来解决这个问题?
我有一个标准的put
方法来向树中添加新单词。我试图使用有序遍历来打印单词,但我不确定如何完成该功能。
class TST {
private Node root;
public void put(String key, int value) {
root = put(root, key, value, 0);
}
private Node put(Node node, String key, int value, int index) {
char c = key.charAt(index);
if( node == null ){
node = new Node(c);
}
if( c < node.character ){
node.left = put(node.left, key, value, index);
}else if( c > node.character ){
node.right = put(node.right, key, value, index);
}else if( index < key.length()-1 ){
node.middle = put(node.middle, key, value, index+1);
}else{
node.value = value;
}
return node;
}
public Integer get(String key) {
Node node = get(root, key, 0);
if (node == null) {
return null;
}
return node.value;
}
public Node get(Node node, String key, int index) {
if(node == null) {
return null;
}
char c = key.charAt(index);
if (c < node.character) {
return get(node.left, key, index);
} else if (c > node.character) {
return get(node.right, key, index);
} else if(index < key.length() -1) {
return get(node.middle, key, index);
} else {
return node;
}
}
public void inorderTraversal(Node node) {
System.out.print(node.character + ":" + node.value + " ");
if(node.left != null) {
inorderTraversal(node.left);
}
if(node.middle != null) {
inorderTraversal(node.middle);
}
if(node.right != null) {
inorderTraversal(node.right);
}
}
public void traverse() {
inorderTraversal(root);
}
}
public class Main {
public static void main(String[] args) {
TST tst = new TST();
tst.put("This",3);
tst.put("There",4);
tst.put("Them",5);
tst.put("High",6);
System.out.println(tst.get("T"));
tst.traverse();
}
}
class Node {
public char character;
public Node left, right, middle;
public int value;
public Node(char character) {
this.character = character;
}
}
答案 0 :(得分:0)
由于每个节点只存储一个字符,因此您需要传递一个String(或StringBuilder,如果您尝试提高效率),表示在进行遍历时由根路径定义的前缀。 / p>
根据三元搜索树的定义,您只应在转到中间节点时附加到此前缀。
示例实现:
public void inorderTraversal(Node node, String word) {
// handle end of word
if (node.value != 0) {
System.out.println(word + node.character + ": " + node.value);
}
if(node.left != null) {
inorderTraversal(node.left, word);
}
if (node.middle != null) {
inorderTraversal(node.middle, word + node.character);
}
if(node.right != null) {
inorderTraversal(node.right, word);
}
}
public void traverse() {
inorderTraversal(root, "");
}
在构建过程中,也可以存储代表每个节点的完整单词的字符串,因为您已经在put
方法中使用了完整的单词(如果您不担心内存使用情况)。
请注意,此/您的代码不允许将字词映射到0值 - 处理这种情况的一种方法是使用Integer
代替int
,然后您可以使用{ {1}}检查单词的结尾。