我想了解一个简单的拼写检查程序。程序基本上是读取字典文件,把文字放在树上。当它执行检查功能时,它一次从文件中取一个单词进行检查,并使用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?
}
答案 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;
}
...
}
请注意,类型参数在这里明确命名为Key
和Value
,这应该强化我上面所说的内容。另请注意,Node
包含键和值 - 值为&#34;有效负载&#34;,正在存储的实际数据,而密钥用于排序和组织树(因此Key
必须实现Comparable
)。顺便说一句,请注意,此处的等效方法不是add()
,而是put()
,我认为这也更清晰,因为我们习惯于在地图上调用put(k, v)
列表上的结构和add(t)
(我想知道这是否会在你的混乱中发挥作用)
就像我说的那样,我并不完全确定你对此感到困惑。我已经说过我在这里所说的内容了,因为您似乎已经具体询问了类型参数,但是你发表评论时我还不清楚其他内容并且我会更新。
(也就是说,我把上面的整个方法都包括在内,因为如果您真正想要了解的是BST在一般情况下是如何运作的,那么这是一个非常重要的理解方法。仔细检查并弄清楚每条线路正在做什么,以及为什么要这样做。然后为get()
执行相同操作,然后你就可以了。