Java 为什么'root'保持为空?

Java 为什么'root'保持为空?,java,data-structures,binary-tree,Java,Data Structures,Binary Tree,我有一个非常基本的二叉树 import java.util.Scanner; public class ExprTree { // Data member private ExprTreeNode root; // reference to root node private String input; private Scanner s = new Scanner(System.in); // Constructor public ExprT

我有一个非常基本的二叉树

import java.util.Scanner;


public class ExprTree {
    // Data member
    private ExprTreeNode root; // reference to root node
    private String input;
    private Scanner s = new Scanner(System.in);
    // Constructor
    public ExprTree() {
//      root = new ExprTreeNode(key, leftPtr, rightPtr)
    }
    // Expression tree manipulation methods
    public void build() {
        System.out.println("Please enter a prefix sequence. avoid using spaces!");
        input = s.nextLine();

        for(int i = 0; i < input.length(); ++i) {
            addToTree(root, input.charAt(i));
        }       
    }

    public void expression() {
    }

    public float evaluate() {
        return 0;

    }

    public void clear() {

    }

    public void showStructure(ExprTreeNode t) {
        if(t == null) // no more
            return;
        System.out.println(t.getKey() + "-> ");
        showStructure(t.getLeft());
        showStructure(t.getRight());
    }

    private void showSubTrees(ExprTreeNode p, int leven) {

    }

    private void addToTree(ExprTreeNode t, char key) {
        if(t == null) { // no more
            t = new ExprTreeNode(key, null, null);
            return;
        } 
            addToTree(t.getLeft(), key);
            addToTree(t.getRight(), key);
    }

    public ExprTreeNode getRoot() {
        return root;
    }

    public static void main(String[] args) {
        ExprTree t = new ExprTree();
        t.build();
        t.showStructure(t.getRoot());
    }
}
在这方面:

        for(int i = 0; i < input.length(); ++i) {
            addToTree(root, input.charAt(i));
        }
for(int i=0;i
每次我用
root
调用
addToTree
,debugegr显示
root
为空

即使我第一次调用
addToTree
时已经分配了root,调试器也显示了这一点


为什么它一直保持为空?

您在中注释掉了该行

public ExprTree() {
    //  root = new ExprTreeNode(key, leftPtr, rightPtr); 
    // just use null for both left and right ptr
}
所以
root
null

记住java是按值传递的,所以

private void addToTree(ExprTreeNode t, char key) {
    if(t == null) { // no more
        t = new ExprTreeNode(key, null, null);
        return;
    } 
        addToTree(t.getLeft(), key);
        addToTree(t.getRight(), key);
}
打电话给

 addToTree(root, input.charAt(i));

t
root
具有相同的引用,即
null
,但不是对变量
root
的引用。因此,您所做的只是重新分配一个局部变量。

Java是通过值传递的吗?真正地我确信它是路过的。。有办法通过引用传递吗?@user1798362没有。相反,直接分配根,左和右,而不是调用方法。如何通过函数分配内存?@user重新设计您的方法。使用
t.setLeft(someValue)
。您直接从
getRoot()
方法返回一个未初始化的
root
对象。@Lion我在
addToTree
方法中分配它
 addToTree(root, input.charAt(i));