在java中实现BInary Tree

时间:2014-12-16 06:39:01

标签: java binary-search-tree

我正在尝试在java中实现二进制树,这是我的代码:

class TestClass {

    public static  void newnode(int a , Node root,){


             root = new  Node(a);
              System.out.println(root.data);   // Printing out 22

                                          }
    public static void main(String args[] ) throws IOException {


      Node root = null;
      newnode(22,root);
      System.out.println(root.data);  // Giving NullPointerException


    }
    }
    class Node{ 
        Node left ;
        Node Right;
        int data ;

        Node(int dataa){

            this.data = dataa;
        }
    }

我无法在树中插入新节点,root的值不会改变

当我调用newnode函数时,我得到了我的根节点的正确值,但是在main函数中它给出了我的零点异常

为什么root的值没有更新

3 个答案:

答案 0 :(得分:1)

class TestClass {

    public static  Node newnode(int a , Node root){
        root = new  Node(a);
        System.out.println(root.data);   // Printing out 22
        return root;
    }
    public static void main(String args[] ) throws IOException {
        Node root = null;
        root = newnode(22,root);
        System.out.println(root.data);  // Giving NullPointerException
    }
}

试试这个

答案 1 :(得分:0)

来自Passing Reference Data Type Arguments

  

引用数据类型参数(如对象)也按值传递给方法。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象的字段具有适当的访问级别,则可以在该方法中更改它们的值。

Java传递参数作为Pass-by-Value而不是引用:所以你给定的代码:

public static void main(String args[] ) throws IOException {
  Node root = null;
  newnode(22,root); // you are passing root
  System.out.println(root.data);  // Giving NullPointerException because its pass by value
}

正确的方法可能是:

public static  Node newnode(int a , Node root){
    root = new  Node(a);
    System.out.println(root.data);   // Printing out 22
    return root;
}
public static void main(String args[] ) throws IOException {
    Node root = null;
    root = newnode(22,root);
    System.out.println(root.data);  // NO NullPointerException
}

答案 2 :(得分:0)

您不应该设计具有大量输入参数的方法,因为测试会更加痛苦。此外,没有必要将null传递给方法只是为了给它分配一个对象 - 这是糟糕的设计。

import java.io.IOException;

class TestClass {
    // This method is useless, use Factory Design Pattern if you want 
    // to create such solution with multiple variants
    public static Node newNode(int a) {
        return new Node(a);
    }

    public static void main(String args[]) throws IOException {
        Node root = newNode(22);
        System.out.println(root.getData());
    }
}

class Node { 
    private int data;
    private Node left;
    private Node right;

    public Node(int data) {
        this.data = data;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }
}