我正在学习数据结构,遇到了一个我无法解决的pbm。有人可以在这里帮忙吗?
我创建了一个TreeNode
类。在同一个包中,我创建了另一个类。 这个类有两个方法。一种inorder
遍历,还有另一种方法(从现有方法制作新的二叉树)。我称inorder
遍历工作正常。但是如果我在另一个方法之后调用inorder
遍历方法,我就会得到异常。
另一种方法创建一个新的二叉树,但它独立于遍历方法inorder
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
TreeNode(int x) { val = x; }
}
In the same package I created another class.
package BST;
public class Check {
TreeNode curr;
TreeNode prev;
public void orderTraversal( TreeNode curr1) {
if(curr1 == null)
return;
orderTraversal(curr1.left);
if(curr == null ) {
curr = curr1;
prev = curr1;
}
else {
prev.right = curr1;
prev = curr1;
}
orderTraversal(curr1.right);
}
public static void main(String[] args) {
// TODO Auto-gene`enter code here`rated method stub
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.right = new TreeNode(15);
Check check = new Check();
check.inOrder1(root);
check.orderTraversal(root);
check.inOrder1(root);
}
public void inOrder1(TreeNode root) {
if(root != null) {
inOrder1(root.left);
System.out.printf("%d ",root.val);
inOrder1(root.right);
}
}
}
When running the program , I am getting an exception in the method in the second call of inOrder1 .
at sun.nio.cs.UTF_8.updatePositions(Unknown Source)
at sun.nio.cs.UTF_8.access$200(Unknown Source)
at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(Unknown Source)
at sun.nio.cs.UTF_8$Encoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.append(Unknown Source)
我知道 java 按值传递工作。第二种方法是仅引用实例变量。如果我check.orderTraversal(root)
注释掉对InOrder1
的第二次调用工作正常。我不知道为什么会这样?谁能帮忙?
谢谢!
在你的方法orderTraversal
你正在修改你的树在行
prev.right = curr1;
那是你的错误。我真的不知道你打算在那里做什么,但你不应该在树遍历中修改你的树。
你说
第二种方法是仅引用实例变量
但是当你执行prev = curr1
时,你的实例变量prev
指向树中的节点。然后,当您执行prev.right = curr1
时,您可以修改prev
指向的节点。
因为修改树,所以要创建循环引用。节点 3 将节点 9 作为他的左子级,但节点 9 再次将 3(他自己的父级)作为他的左子级。这不再是一棵树,这就是为什么您第二次调用inOrder1
时有无限数量的调用,以StackOverflowError
结尾。
顺便说一下,这可以通过使用调试器轻松看到,我建议您查看此页面。