Java 调用方法时发生调用异常?
以下是我的右BST旋转方法:Java 调用方法时发生调用异常?,java,Java,以下是我的右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.getPare
/**
* 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;
}
(在下面的树中,“n”是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); }
在我的rotate方法中,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)
**递归InOrderTraversals将持续一段时间。。。但是你明白要点了,哈哈
我在想toString()有问题吗?它被困在这样的循环中是没有意义的,直到我添加了else{}语句,它才被使用,但我需要它,因为它没有正确地旋转。你没有共享所有的代码,所以我来猜一猜。如果节点的数据设置为null,那么toString()方法将失败。我相信您的IDE正在引发异常,因为它试图调用toString()来显示调试器中的对象。您可以共享堆栈跟踪吗?我相信如果您在树中的某个地方有一个循环,您将得到该错误。你在使用Eclipse吗?嗯,这很可能是我的问题。但是,如果一个节点只有一个子节点,另一个子节点为null,但是旋转涉及将其中一个子节点(可能为null)设置为另一个节点。。。hmmmOh wait,没有节点的数据设置为null,只是没有节点用于3的右子节点,因此它是一个null空间。所以我不明白为什么使用集合会导致这种情况。不过可能是类似的问题。setLeft()和setRight()的代码是做什么的?你是空检查吗?否:P。他们所做的只是将正确的节点设置为指定的节点,即使该节点为空,也应该可以工作,它只会将其设置为实际节点。但我相信我发现了问题所在!在else{}语句中,我需要将n的一个子引用设置为null,因为它的父引用仍然是它的子引用。哈哈哈哦,天哪,在那里。。。你创造了一个无意的循环,这是我最初的想法。恭喜!
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)