Java 为什么这个方法会导致无限递归调用?
我很难理解为什么这个类不能正常工作。这是数据结构课程作业的一部分(编辑:作业的截止日期已经过了,我只想弄清楚…)。该节点是基于BST构建的AVL树的一部分,我选择的实现方式是通过在我的node类中创建方法来找到平衡因子和高度 课程结构如下:Java 为什么这个方法会导致无限递归调用?,java,recursion,stack-overflow,avl-tree,recursive-datastructures,Java,Recursion,Stack Overflow,Avl Tree,Recursive Datastructures,我很难理解为什么这个类不能正常工作。这是数据结构课程作业的一部分(编辑:作业的截止日期已经过了,我只想弄清楚…)。该节点是基于BST构建的AVL树的一部分,我选择的实现方式是通过在我的node类中创建方法来找到平衡因子和高度 课程结构如下: public class Node<T extends Comparable<? super T>> { public T data; public Node left; public Node right; public Nod
public class Node<T extends Comparable<? super T>> {
public T data;
public Node left;
public Node right;
public Node(T IN) {
data = IN;
}
public Node(T IN, Node L, Node R) {
this(IN);
left = L;
right = R;
}
@Override
public String toString() {
return data.toString();
}
@Override
public Node clone() {
return new Node(this.data) ;
}
public int getHeight() {
return getHeight(this) ;
}
public int getBF() {
//Calculate BF
int balanceFactor = 0;
if (right != null && left != null)
balanceFactor = getHeight(right) - getHeight(left);
else if (left != null) {
balanceFactor = 0 - getHeight(left) ;
}
else if (right != null) {
balanceFactor = getHeight(right) ;
}
else
balanceFactor = 0 ;
return balanceFactor ;
}
private int getHeight(Node p) {
if (p.left == null && p.right == null ) {
return 0 ;
}
else if (p.left != null && p.right != null) {
return 1 + max(p.left.getHeight(), p.right.getHeight());
}
else if (p.left != null) {
return 1 + p.left.getHeight() ;
}
else if (p.right != null) {
return 1 + p.right.getHeight() ;
}
else {
return 0;
}
}
private int max(int x, int y) {
if (x >= y) {
return x;
} else {
return y;
}
}
我收到的例外是重复:
Exception in thread "main" java.lang.StackOverflowError
at Node.getHeight(Node.java:54)
at Node.getHeight(Node.java:33)
at Node.getHeight(Node.java:58)
从两种getHeight方法来看,似乎没有树,只有循环图。您应该从只包含根的树开始测试,然后添加节点,直到观察到无限递归为止。您可能在重新平衡树的函数中出错
编辑:您应该将属性(至少是左属性和右属性)设置为私有属性。从两种getHeight方法来看,似乎您没有树,只有循环图。您应该从只包含根的树开始测试,然后添加节点,直到观察到无限递归为止。您可能在重新平衡树的函数中出错
编辑:你应该将属性(至少是左属性和右属性)设置为私有属性。我建议你的树要么变形了,要么太大了。代码似乎没有问题 如果树发生变形,导致在同一棵树中插入两次
节点
,则此代码将中断
添加了-你吃的堆栈比你需要的多一点-将
p.left.getHeight()
替换为getHeight(p.left)
等将避免每次递归一次堆栈推送。如果你的问题仅仅是一棵大树,那么这可能会让你勉强通过,但这只会推迟问题的解决。我建议要么你的树变形了,要么真的很大。代码似乎没有问题
如果树发生变形,导致在同一棵树中插入两次节点
,则此代码将中断
添加了-你吃的堆栈比你需要的多一点-将
p.left.getHeight()
替换为getHeight(p.left)
等将避免每次递归一次堆栈推送。如果您的问题仅仅是一棵大树,那么这可能会让您勉强通过,但这只会推迟问题的解决。顺便问一下,基本情况不应该返回1而不是0吗?请确保在默认情况下以及在“int Node(t in)”构造函数中的left和right reference为null:)您是否检查了树中是否有圆?这可能会导致错误…@ Dr.Wr:为什么不应该是?嗯,在C++中是一个“必须”的实践,但是我只是在java中看到的不是这样的:顺便问一下,基础情况不应该返回1而不是0吗?请确保默认的左、右引用null和“int节点(t in))构造器:)你检查了你的树中是否有一个圆?这可能会导致错误…@德文:为什么不应该这样?嗯,在C++中是一个“必须”的实践,但我只是在java中看到的:“从两个GeTeHeT方法来看,似乎你没有一个树,而是一个循环图”。-你是如何得出这个结论的?因为如果它是一个非循环图,那么这些方法不会导致无限递归。“从两个getHeight方法来看,似乎你没有树,只有一个循环图”-你是如何得出这个结论的?因为如果它是一个非循环图,那么这些方法就不会导致无限递归。如果我用一个简单的二叉树测试getHeight()和getBF()方法,它似乎有效,我会看看我的AVL树,看看它是否损坏,谢谢。我修复了它!问题出在我的AVL树的checkBalance()方法中,我只是简单地切换了我的旋转,问题的存在是因为树断了,所以感谢@OldCurmudgeon让我查看我的数据结构!如果我用一个简单的二叉树测试getHeight()和getBF()方法,它似乎可以工作,我会看看我的AVL树,看看它是否损坏,谢谢。我修复了它!问题出在我的AVL树的checkBalance()方法中,我只是简单地切换了我的旋转,问题的存在是因为树断了,所以感谢@OldCurmudgeon让我查看我的数据结构!
Exception in thread "main" java.lang.StackOverflowError
at Node.getHeight(Node.java:54)
at Node.getHeight(Node.java:33)
at Node.getHeight(Node.java:58)