这是我正确的BST轮换的方法:
/**
* Performs right rotation on a node
* Reset tags redoPreorder, redoInorder, redoPostorder
*
* @param n
*/
public void rightRotate(Node<E> n)
{
Node<E> left = n.getLeft();
Node<E> parent = n.getParent();
left.setParent(parent);
parent.setLeft(left);
n.setParent(left);
if(left.getRight() != null){
Node<E> right = left.getRight();
n.setLeft(right);
//n.setLeft(right);
right.setParent(n);
left.setRight(n);
}
else{
left.setRight(n);
}
redoInorder = true;
redoPostorder = true;
redoPreorder = true;
}
这是我的节点toString()
/**
* Write the value of the instance variable named data.
*/
public String toString()
{
String str = data + "";
return str;
}
(在下面的树中,&#39; n&#39;是4) 所以我要翻过一棵树:
+7
+4
+3
-2
-
-6
+11
-9
+18
+14
-12
-17
+19
-
+22
-20
-
注意:+表示节点有子节点, - 表示它是一个叶子。对于 +7 -4 -8 7是树/子树的根,4是左子,8是右子(这不是我的例子,只是为了让你知道这种符号是如何工作的)。
所以我的问题......当我点击
else{ left.setRight(n); }
在我的旋转方法中,eclipse给了我 com.sun.jdi.InvocationException发生了调用方法。
我不明白为什么。我的节点设置器的所有其他实例都运行正常,而且这个错误没有给出任何导致问题的提示,所以我看到有人比我更有经验可能会找到一些东西。我只是不明白为什么会导致问题。
感谢您的帮助。
如果有帮助,这里是正确的旋转测试的失败追踪:
java.lang.StackOverflowError
at java.lang.Integer.toString(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:363)
at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:366)
at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:366)
** recursiveInorderTraversals会持续一段时间......但是你得到了要点大声笑。
我在想toString()有什么问题?如果它被卡在这样的循环中是没有意义的,在我添加了else {}语句之前它没有用,但我需要它,因为它没有正确旋转。 / p>
答案 0 :(得分:1)
您没有共享所有代码,所以我会猜测。如果您的节点将数据设置为null,那么您的toString()方法将失败。我相信你的IDE会抛出异常,因为它试图调用toString()来显示调试器中的对象。