如何返回递归添加的trie的根?

时间:2019-02-02 23:40:57

标签: java recursion trie

我正在尝试使用链表将字符串添加到以'$'作为终止字符的特里。但是,它仅返回Trie的最后一个节点,而不返回Trie的根。这是我的代码:

public class DictionaryDLB{

    private Node root;

    private class Node{
        public char value;
        public Node next;
        public Node child;

        public Node() {}
        public Node(char value){
            this.value = value;
            this.next = null;
            this.child = null;
        }
    }
    public void add(String word){
        root = add(root, word, 0);
    }

    private Node add(Node root, String key, int d){
        char c;
        if (d != key.length()) c = key.charAt(d);
        else c = '$';
        if (root == null) root = new Node(c);
        if (d == key.length()) { return root; }
        if (c != root.value) root = add(root.next, key, d);
        return root = add(root.child, key, d+1);
    }

完成后,它将返回值为$的节点,并且没有子节点或下一个节点。

1 个答案:

答案 0 :(得分:0)

原因是因为您在返回root之前将add设置为返回值root。结果是您将从调用堆栈中获得root的最后一个实例。例如,假设我叫add("hi")。假设root以null开始,这就是函数调用堆栈的样子,

add("hi")
root = add(root, "hi", 0)
    root = new Node('h')
    return root = add(root.child, "hi", 1)
        root = new Node('i')
        return root = add(root.child, "hi", 2)
            root = new Node('$')
            return root //Node('$')
        return root //Node('$')
    return root //Node('$')
root = root //Node('$')

请注意,函数调用向下传递的是值为'$'的节点。原因是您将方法底部的root设置为add的返回值。不需要这样做。只需像您当前所做的那样致电add,然后像这样分别返回root

private Node add(Node root, String key, int d){
    char c;
    if (d != key.length()) c = key.charAt(d);
    else c = '$';
    if (root == null) root = new Node(c);
    if (d == key.length()) { return root; }
    if (c != root.value) root.next = add(root.next, key, d);
    else root.child = add(root.child, key, d+1);
    return root;
}

您现在必须将add的结果设置为root.next或root.child。这是因为在调用add中创建的节点必须被传递回以设置下一个或子指针。为了更好地说明,让我们重新运行add("hi")的示例堆栈跟踪。

add("hi")
root = add(root, "hi", 0)
    root = new Node('h')
    root.child = add(root.child, "hi", 1)
        root = new Node('i')
        root.child = add(root.child, "hi", 2)
            root = new Node('$')
            return root //Node('$')
        root.child = root //Node('$')
        return root //Node('i')
    root.child = root //Node('i')
    return root //Node('h')
root = root //Node('h')