【发布时间】:2014-06-12 10:18:32
【问题描述】:
class Node<K> {
public K key;
public int height;
public Node<K> left, right, parent;
public Node(K x, Node<K> l, Node<K> r, Node<K> p) {
key = x;
left = l;
right = r;
parent = p;
height = 1;
}
}
public class AVLFrom<K extends Comparable<K>> {
public Node<K> root;
// it should be private for software engineering and abstraction purposes
// but I want to check your tree shapes in my tester, so forgive me
public AVLFrom() {
root = null;
}
public void insert(K k) {
root = BSTinsert(k, root, null);
}
private Node<K> BSTinsert(K k, Node<K> v, Node<K> parent) {
if (v == null) {
return new Node<K>(k, null, null, parent);
}
else {
int m = k.compareTo(v.key);
//if k > v, then insert in right subtree
if (m > 0) {
v.right = BSTinsert(k, v.right, v);
}
//if k <= v, insert in left subtree
else {
v.left = BSTinsert(k, v.left, v );
}
}
return v;
}
我正在创建一个 AVL 树,但由于我对 Java 非常不熟悉,所以我只想创建一个普通的 BST 来尝试掌握 Java,然后从那里修改它以使其成为 AVL 树。不幸的是,我无法添加多个节点。
例如,如果我写下面的代码:
AVLFrom<Integer> s = new AVLFrom<Integer>();
s.insert(5);
s.insert(10);
代码运行没有任何错误。
那么如果我在insert方法中写下如下代码:
System.out.println(root.key);
System.out.println(root.right.key);
Eclipse 打印值 5,但随后在“root.right.key”部分出现 NullPointerException。
但如果我在 BSTinsert 方法中添加以下代码:
System.out.println(v.key);
System.out.println(v.right.key);
Eclipse 打印 5 和 10。
我不知道为什么会这样,因为如果 v 和 v.right 正确打印 5 和 10,当我返回 v 并将其分配给变量“root”时,尝试时它不应该出现 NullPointerException 错误打印 root.right。我将不胜感激。
在我看来,当在 BSTinsert 方法中返回 v 时,所有“连接”到 BSTinsert 中传递的根节点的节点都不会说已连接/已连接。我不知道为什么会这样。
谢谢!
【问题讨论】: