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);
代码运行没有任何错误。
然后,如果我在插入方法中写下以下代码:
System.out.println(root.key);
System.out.println(root.right.key);
Eclipse打印值5但是我在&#34; root.right.key&#34;得到了NullPointerException。一部分。
但是如果我在 BSTinsert 方法中添加以下代码:
System.out.println(v.key);
System.out.println(v.right.key);
Eclipse打印5和10。
我不知道为什么会发生这种情况,因为如果v和v.right正确打印5和10,当我返回v并将其分配给变量&#34; root&#34;时,它不应该尝试打印root.right时出现NullPointerException错误。我将不胜感激任何帮助。
在我看来,所有获得连接的节点都是&#34;对于在BSTinsert中传递的根节点,在BSTinsert方法中返回v时,不要说连接/连接。我不知道为什么会这样。
谢谢!
答案 0 :(得分:0)
天啊,我只是觉得我意识到错误了。当我插入5时,在插入函数中,我在插入第二个元素之前打印了根和root.right,这就是为什么我一直得到NullPointerException! -
答案 1 :(得分:0)
NPE出现在insert
root.right
为空的System.out.println(root.right != null ? root.right.key : "");
期间。以下修改将解决问题。
{{1}}