Java通过递归传递值

时间:2015-01-12 10:39:06

标签: java oop recursion parameter-passing binary-search-tree

以下是使用java的二进制搜索树的简单实现。但是,代码总是输出“BST空!!”尽管插入元素。我哪里错了?我怀疑我的递归出错了。非常感谢任何帮助。

public class BinarySearchTree {
    NODE root;
    BinarySearchTree(){
        root = null;
    }
    void insert(NODE nodeptr,int key){
        if(root == null){
            nodeptr = new NODE(key);
            return;
        }
        if(nodeptr == null){
            nodeptr = new NODE(key);
            return;
        }
        if(key <= nodeptr.data){
            insert(nodeptr.left,key);
        }
        else{
            insert(nodeptr.right,key);
        } 

    }

    void inorder(NODE nodeptr){
        if(nodeptr == null){
            System.out.println("BST empty!!");
            return;
        }
        inorder(nodeptr.left);
        System.out.println(nodeptr.data + " ");
        inorder(nodeptr.right);

    }
    /*driver program*/
    public static void main(String args[]){
        int[] a = {20,30,40,24,39};
        BinarySearchTree bst = new BinarySearchTree();
        for (int i: a){
            bst.insert(bst.root,i);
        }
        bst.inorder(bst.root);
    }
}

class NODE{
    int data;
    NODE left,right;
    NODE(int data){
        this.data = data;
        left = null;
        right = null;
    }
}

3 个答案:

答案 0 :(得分:5)

您的insert方法永远不会为根分配值,因此它保持为空。

如果我理解您的代码,您的插入内容应如下所示:

void insert(NODE nodeptr,int key){
    if(root == null){
        root = new NODE(key);
        return;
    }
    if(nodeptr == null){
        insert (root, key);
        return;
    }
    if(key <= nodeptr.data){
        if (nodeptr.left != null)
            insert(nodeptr.left,key);
        else
            nodeptr.left = new NODE(key);
    }
    else{
        if (nodeptr.right != null)
            insert(nodeptr.right,key);
        else
            nodeptr.right = new NODE(key);
    } 

}
  • 如果root为空,请忽略传递的nodeptr并将key放在树的根目录。
  • 如果nodeptr为空,请尝试从树的根开始插入新密钥。
  • 否则,一旦找到空nodeptr.leftnodeptr.right,就必须将新key放在那里,因为如果再进行一次递归调用,则会将一个空节点传递给它,递归永远不会结束。

答案 1 :(得分:1)

从Erans扩展回答您可以将其更改为:

public void insert(int key){
    if(root == null){
        root = new NODE(key);
        return;
    }
    insert(root,key)
  }

private void insert(NODE nodeptr,int key){
    if(key <= nodeptr.data){
        if(nodeptr.left == null){
           nodeptr.left = new NODE(key)
        }
        else {
            insert(nodeptr.left,key);
        }
    }
    else{
        if(nodeptr.right == null){
           nodeptr.right = new NODE(key)
        }
        else {
            insert(nodeptr.right,key);
        }
    } 
}

编辑:因为他现在添加了自己的代码,这只是你更喜欢什么样的风格。单个方法或两个方法,公共方法只有一个参数。

答案 2 :(得分:0)

我希望我的插入方法是这样的。最后工作了。谢谢大家的宝贵时间。

NODE insert(NODE nodeptr,int key){
        if(nodeptr == null){
            nodeptr = new NODE(key);
        }
        else if(key <= nodeptr.data){
            nodeptr.left = insert(nodeptr.left,key);
        }
        else{
            nodeptr.right = insert(nodeptr.right,key);
        } 
        return nodeptr;

    }

我会从这样的主要内容调用insert方法:

bst.root = bst.insert(bst.root,i);