如果您想了解 BST 的健壮实现,这里有一个:
http://algs4.cs.princeton.edu/32bst/BST.java.html
另外,如果您想真正了解那里发生了什么以及为什么发生,我建议您也可以查看/阅读那里的课程。
编辑:
首先,让我们在这里解决几个问题。
看着你的班级,你声称每个Node 都是Tree。现在,这可能是有道理的,但使用 Tree 作为一组链接的 Nodes 的包装器应该是一种更简单的方法。
用所谓的外行术语来说,您可以通过递归和迭代两种方式进行 BST 操作。我会给你一个例子。
迭代版本:
private void addIterative(T item) {
if (root == null) {
root = new Node(item);
return;
}
Node parent = null;
Node node = root;
int cmp = 0;
while (node != null) {
cmp = item.compareTo(node.item);
if (cmp == 0) {
return;
} else if (cmp < 0) {
parent = node;
node = node.left;
} else {
parent = node;
node = node.right;
}
}
Node child = new Node(item);
if (cmp < 0) {
parent.left = child;
} else if (cmp > 0) {
parent.right = child;
}
}
递归版本:
private Node add(Node node, T item) {
if (node == null) {
return new Node(item);
}
int cmp = item.compareTo(node.item);
if (cmp == 0) {
// it already exists
} else if (cmp < 0) {
node.left = add(node.left, item);
} else {
node.right = add(node.right, item);
}
return node;
}
在迭代版本中,您使用循环在树中移动,一旦找到添加节点的位置,您只需创建并链接它。
另一方面,递归版本可以说是自我构建。在每次插入时,您都在树下刷新指向该路径的链接。
所以,迭代 - 在 while 循环中遍历树;递归 - 通过递归调用在树中移动。
您的示例使我相信您打算使用添加新元素的迭代版本。在这种情况下,您(我相信)只需返回 Tree 的实例以进行方法链接,因此您可以执行以下操作:
node.insert("1").insert("2");
我仍然建议您修改您对 Nodes 和 Trees 的看法,但如果这不可能,那么我想您需要以某种方式解决它。