如何在Trie中打印出所有单词?

时间:2017-12-27 13:16:31

标签: java algorithm data-structures ternary-search-tree

我有三元搜索树 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;
    }
}

1 个答案:

答案 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, "");
}

Demo

在构建过程中,也可以存储代表每个节点的完整单词的字符串,因为您已经在put方法中使用了完整的单词(如果您不担心内存使用情况)。

请注意,此/您的代码不允许将字词映射到0值 - 处理这种情况的一种方法是使用Integer代替int,然后您可以使用{ {1}}检查单词的结尾。