关于生成树的递归方法的问题

时间:2014-06-23 22:53:56

标签: java recursion data-structures arraylist tree

我想了解一个简单的拼写检查程序。程序基本上是读取字典文件,把文字放在树上。当它执行检查功能时,它一次从文件中取一个单词进行检查,并使用retrieve()查看该单词是否在树中。

我的问题是,我不明白这种“添加”方法是如何工作的。它应该将字典中的单词添加到树结构中。你能帮我解释一下这是怎么回事吗?非常感谢!

   private static BinarySearchTree<StringItem, String> tree = new BinarySearchTree<StringItem, String>();
  //Does this create a tree with StringItems as nodes? 
  //In which part does this method assign value to the tree nodes?


   private static ArrayList<String> dictionary;//number is the number of strings in the dictionary

   private static TreeNode<StringItem> add (int number) { // adds to the tree
   //the numberOfWords has been counted in other methods. 

    if (numberOfWords < 1) {
        return null;
    }

    TreeNode<StringItem> left = add(number / 2); //What does this do?

    StringItem word = new StringItem(dictionary.remove(0) + "");

    TreeNode<StringItem> right = add((number - 1) / 2);

    return new TreeNode<StringItem>(word, left, right); // I don't understand this part.
    //which node are we returning here? 

}

1 个答案:

答案 0 :(得分:0)

查看this 真正普林斯顿人们写的二进制搜索树的良好实现(事实上 - 检查所有真的他们已经针对各种基本算法发布了良好的实现here

我对你的具体问题有点不清楚,但让我们从这开始:

private static BinarySearchTree<StringItem, String> tree = ...
//Does this create a tree with String items as nodes?   

我认为如果你认为BST更像是一个地图(一种类型的键映射到另一种类型的值)而不是单一类型的简单对象列表,那将会有所帮助。如果我们看一下与上面相关的实现,我认为这有点清楚:

public class BST<Key extends Comparable<Key>, Value> {
    private class Node {
        private Key key;           // sorted by key
        private Value val;         // associated data
        private Node left, right;  // left and right subtrees
        private int N;             // number of nodes in subtree
        ...
    }
    ...
    private Node put(Node x, Key key, Value val) {
        if (x == null) return new Node(key, val, 1);
        int cmp = key.compareTo(x.key);
        if      (cmp < 0) x.left  = put(x.left,  key, val);
        else if (cmp > 0) x.right = put(x.right, key, val);
        else              x.val   = val; 
        x.N = 1 + size(x.left) + size(x.right);
        return x;
     }
  ...
}

请注意,类型参数在这里明确命名为KeyValue,这应该强化我上面所说的内容。另请注意,Node包含键值 - 值为&#34;有效负载&#34;,正在存储的实际数据,而密钥用于排序和组织树(因此Key必须实现Comparable)。顺便说一句,请注意,此处的等效方法不是add(),而是put(),我认为这也更清晰,因为我们习惯于在地图上调用put(k, v)列表上的结构和add(t)(我想知道这是否会在你的混乱中发挥作用)

就像我说的那样,我并不完全确定你对此感到困惑。我已经说过我在这里所说的内容了,因为您似乎已经具体询问了类型参数,但是你发表评论时我还不清楚其他内容并且我会更新。

(也就是说,我把上面的整个方法都包括在内,因为如果您真正想要了解的是BST在一般情况下是如何运作的,那么这是一个非常重要的理解方法。仔细检查并弄清楚每条线路正在做什么,以及为什么要这样做。然后为get()执行相同操作,然后你就可以了。