繁体   English   中英

为什么此方法会导致无限递归调用?

[英]Why does this method cause an Infinite Recursive call?

我正在努力理解为什么该类无法正常工作。 这是关于数据结构课程的作业的一部分(编辑:作业的截止日期已经过去,我只想弄清楚...)。 该节点是建立在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;
    }
}

}

调用该方法的函数是:

@Override
public boolean insert(T el) {
    boolean test = super.insert(el) ;
    if (test) {
        return checkBalance(root) ;
    }
    else
        return false ;
}

我收到的例外是以下内容的重复:

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)

我建议您的树变形或很大。 代码似乎没有问题。

如果您的树变形,使得您在同一棵树中插入了两次Node ,则此代码将中断。

补充 -您正在吃的堆栈比您需要的多-用getHeight(p.left)等替换p.left.getHeight() getHeight(p.left)等将避免每次递归一次堆栈推送。 如果您的问题只是一棵大树,那么这可能会刮伤您,但这只会推迟问题。

从两个getHeight方法来看,似乎您没有树,而是有一个循环图。 您应该从仅包含根的树开始测试,然后添加节点,直到观察到无限递归为止。 您可能在重新平衡树的函数中出错。

编辑:并且您应该使属性(至少左和右)私有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM