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));
        }

每次我使用 root 调用 addToTree 时,debugegr 都会显示 root 为 null,

即使我第一次调用 addToTree 时已经分配了根目录,并且调试器也显示了这一点。

为什么它一直保持为空?

最佳答案

您注释掉了该行

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 - 为什么 `root` 一直保持为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20177431/

相关文章:

c++ - 没有指针的递归结构? (霍夫曼)

c - 树重建函数中的指针

algorithm - 打印二叉树中最长的叶到叶路径及其长度

java - 从 thenReturn mockito 返回迭代器

java - 在WebLogic中获取JTA事务超时值

memory-management - 用于以解释语言存储变量的数据结构

data-structures - 重组结构内的盒装元素

data-structures - 如何确保 Rust 向量仅包含交替类型?

java - 在 Swing 应用程序中使用方法

java - 使用 ScaleGestureDetector 时放大太多后无法缩小