返回二叉搜索树的高度

时间:2014-10-12 03:16:39

标签: java binary-search-tree

我有两个类,BSTSet和BSTNode,它们都有一个返回高度的height()方法。我收到了stackoverflow错误,并且不确定导致它的原因。

BSTSet

public class BSTSet <E extends Comparable<E>> extends AbstractSet <E> {

    // the root of the supporting binary search tree
    private BSTNode<E> root;

    // number of elements in the set
    private int count = 0;

    public boolean isEmpty() {
        return count == 0;
    }

    public int size() {
        return count;
    }


    public int height() {
        if(root == null) return -1;
        else return root.height();
    }
}

BSTNode

public class BSTNode <E extends Comparable<E>> {

    private E value;
    private BSTNode<E> left;
    public BSTNode<E> right;

    public BSTNode(E value) {
       this.value = value;
    }

    public E getValue() {
        return value;
    }

    public BSTNode<E> getLeft() {
        return left;
    }

    public BSTNode<E> getRight() {
        return right;
    }

    public int height() {
        if(left == null && right == null) return 0;
        if(left != null  && right == null) {UI.println("left");return left.height()+ 1; }
        else if(right != null && left == null){UI.println("right");return right.height()+ 1;}
        else{UI.println("both"); return Math.max(right.height(), left.height()) + 1;}
    }
}

如果您想要更多代码或需要更多信息,请随时提出。

2 个答案:

答案 0 :(得分:1)

问题是您的递归height()方法正在height()上调用this。这不是算法应该如何工作,并且它是无限递归循环的明显原因,它会给你堆栈溢出。

@ xgeorgekx的方法应该给出正确的答案,但我不相信它是最佳的。如果树是平衡的,那么左右子树的高度是相关的......并且可能不需要遍历两侧。如果您可以避免这种情况,那么height方法可以实现为O(logN)而不是O(N)

我怀疑你原来的方法是O(logN) ...

答案 1 :(得分:0)

if(left == null && right == null) return 0;

更改为

if(left == null && right == null) return 1;

如果某个节点没有子节点,则其高度仍为1

然后就这样做一个递归调用 else return Max(left.height(), right.tHeight) + 1;

根据定义,节点的高度是它的子发辫的最大高度+ 1

堆栈溢出是由于在此处调用同一节点上的height()方法:

else if(left != null && right == null || left == null && right != null) return height()+ 1;
else return height()+ 2;

我只想把它扔进去。如果你想要一个节点,从高度0开始显然保持 if(left == null && right == null) return 0;