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