java - 为什么`root`保持为空?

原文 标签 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 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());
    }
}


和树节点类:

public class ExprTreeNode {
    // Data memebers
    private char key;
    private ExprTreeNode left, 
                         right;
    // Constructor
    public ExprTreeNode(char key, ExprTreeNode leftPtr, ExprTreeNode rightPtr) {
        this.key = key;
        left = leftPtr;
        right = rightPtr;
    }

    public char getKey() {
        return key;
    }

    public void setKey(char key) {
        this.key = key;
    }

    public ExprTreeNode getLeft() {
        return left;
    }
    public void setLeft(ExprTreeNode left) {
        this.left = left;
    }
    public ExprTreeNode getRight() {
        return right;
    }
    public void setRight(ExprTreeNode right) {
        this.right = right;
    }
}


在这一行:

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


每次我用addToTree调用root时,调试器都会显示root为空,

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

为什么它保持为空?

最佳答案

您注释了其中的一行

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


所以rootnull

请记住,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));


troot具有相同的引用,即。 null,但不是对变量root的引用。因此,您要做的就是重新分配局部变量。

相关文章:

java - 将Runnable实例传递给Thread会调用Thread的子类的run()而不是Runnable类的run()

java - 无法运行Java JNI代码

c++ - 多维数组实现[重复]

algorithm - 霍夫曼树与二叉平衡树

c++ - 二叉树级订单遍历LeetCode

java - 线程“主” org.hibernate.exception.ConstraintViolationException中的异常:无法执行语句

java - 缺少退货单错误[重复]

data-structures - 哪些库提供持久性数据结构?

c++ - 从向量中获取n个最佳元素?

python - 二叉树中的最大和路径