使用java在二进制搜索树中保留root的值

时间:2014-02-24 10:59:23

标签: java recursion tree root binary-search-tree

我正在尝试使用java编写二进制搜索树,目前我遇到了在调用某些方法后无法保留root值的问题。

现在我正在编写如下所示的add()和height()方法:

public boolean add(E x) {
    BinaryNode<E> temp = null;
    if (root == null) {
        root = new BinaryNode<>(x);
        temp = root;
        return true;
    } else {


        BinaryNode<E> node = root;

        if(root.equals(x)){
            root = temp;
            return false;
        }

        if (node.element.compareTo(x) < 0) {
            if (node.left == null) {
                node.left = new BinaryNode<E>(x);
                return true;
            }
            root = node.left;
            add(x);
        }
        if (node.element.compareTo(x) > 0) {
            if (node.right == null) {
                node.right = new BinaryNode<E>(x);
                return true;
            }
            root = node.right;
            add(x);
        }
        root = temp;
    }
    return false;
}

节点由以下类描述:

    static class BinaryNode<E> {
    E element;
    BinaryNode<E> left;
    BinaryNode<E> right;

    private BinaryNode(E element) {
        this.element = element;
    }
}

现在,我有BinaryNode root;作为我的BST课程中的属性。这个属性的目的是它允许我通过递归地改变root的值来获得没有输入参数的方法(仅出于教育目的,我不会在这里作弊并使用输入参数,即使它可能更容易)。

add(E x)方法似乎工作正常,但问题是方法height()也改变了属性root,所以当我在调用height()后使用add(E x)时它不起作用因为我还没弄明白如何通过height()方法保留root的值。

height()目前看起来像这样:

public int height() {

    if(root == null){
        return 0;           
    } else {

        int lefth = 0;
        int righth = 0;

        BinaryNode<E> node = root;
        if(root.left != null){
            root = root.left;
            lefth = height();
        }
        if(root.right != null){
            root = root.right;
            righth = height();
        }

        root = node;

        if(lefth > righth){
            return lefth+1;
        } else {
            return righth+1;
        }
    }
}

我肯定知道这个方法有问题,因为它递归地改变了root的值(这是预期的)但是如果你知道我的话,它将root的值“重置”到整个树的实际根目录失败了的意思。

在我的main方法中,我编写了几行代码来测试这两个方法是否有效,我确信add(E x)方法有效但高度()肯定无法正常工作。 height()的目的当然是返回树的高度。

我的主要方法有:

    public static void main(String[] args) {
    BinarySearchTree<Integer> tree = new BinarySearchTree<>();

    int a = 10;
    int b = 11;
    int c = 9;
    int d = 9;
    int e = 5;
    int f = 8;

    System.out.println("Adding " + a + " " + tree.add(a) + " \tHeight: " + tree.height());
    System.out.println("Adding " + b + " " + tree.add(b) + " \tHeight: " + tree.height());
    System.out.println("Adding " + c + " " + tree.add(c) + " \tHeight: " + tree.height());
    System.out.println("Adding " + d + " " + tree.add(d) + " \tHeight: " + tree.height());
    System.out.println("Adding " + e + " " + tree.add(e) + " \tHeight: " + tree.height());
    System.out.println("Adding " + f + " " + tree.add(f) + " \tHeight: " + tree.height());

}

它将以下行输出到控制台:

Adding 10 true  Height: 1
Adding 11 true  Height: 2
Adding 9 true   Height: 2
Adding 9 false  Height: 0
Adding 5 true   Height: 1
Adding 8 true   Height: 2

所以,看起来,我的add(E x)运行正常,因为我不允许添加重复项。但是我真的不知道如何正确编码height()。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我没有仔细阅读过代码,但它看起来/听起来像是在混合临时/局部变量和类变量。

您在调用height时正在修改根节点,这实际上会更改全局评分。

你应该做的是在方法中有一个局部变量来存储当前的根并使用它来搜索,而不是修改全局根。

public int height() {
    Node searchNode = root;
    if(searchNode == null){

现在,您可以使用searchNode进行所有处理,而不会破坏根节点的全局记录。