Java 为什么这个方法会导致无限递归调用?

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

我很难理解为什么这个类不能正常工作。这是数据结构课程作业的一部分(编辑:作业的截止日期已经过了,我只想弄清楚…)。该节点是基于BST构建的AVL树的一部分,我选择的实现方式是通过在我的node类中创建方法来找到平衡因子和高度

课程结构如下:

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)