我对Java比较陌生,目前正在学习如何在Java中实现树,特别是二叉搜索树。现在,我所做的大部分工作都很顺利(Inorder和Postorder遍历,切换节点等),除了一个重要细节:0添加到我的树中,即使我从未插入它。换句话说,当我呼吁顺序遍历45 9 2 100 4时,我得到0 2 4 9 45 100.这是相关代码:
从主要功能:
Scanner sc=new Scanner(System.in);
int m, n, j;
treenode T1=new treenode();
System.out.println("How many numbers will be entered?");
m=sc.nextInt();
System.out.println("Enter "+m+" integers.");
for(j=0;j<m;j++){
n=sc.nextInt();
T1.insert(T1, n);
}
System.out.println("Tree T1, in inorder sequence:");
T1.Inorder(T1);
等
函数调用:
class treenode{
int data; treenode left; treenode right;
public treenode() {};
public treenode(int j)
{data = j; left = null; right = null;}
// Insert node function
public treenode insert(treenode t, int k){
if (t == null)
{t = new treenode();
t.data = k; t.left=null;
t.right=null; return t;}
else{
if( k > t.data)
{t.right = insert(t.right,k);
return t;}
else{t.left = insert(t.left, k);
return t;}}}
// Inorder traversal function
public void Inorder(treenode t){
if(t != null){
Inorder(t.left);
System.out.println(" " + t.data);
Inorder(t.right);}
}
等
是的,我知道,我需要将班级名称改为Treenode,所以它以大写字母开头;我很快就会这样做。
答案 0 :(得分:1)
treenode T1=new treenode();
此行创建一个没有数据值的根节点(默认为0),因此您始终将0作为树的根。
答案 1 :(得分:1)
treenode T1=new treenode();
这将创建一个值为0的节点,而不是一个空树。代表一棵空树很棘手;值null
不能使用当前实现,因为它调用T1.insert()
,这将抛出空指针异常。
一种选择是通过在声明中添加insert()
修饰符并将调用更改为
static
成为静态
T1 = treenode.insert(T1, n);
必须为Inorder()
执行类似的操作,否则调用者需要进行显式空检查。
另一种选择是创建一个包装类Tree
,它有一个根节点(可以是null
)。这将使外部界面更清洁:
T1.insert(n);
T1.Inorder();
顺便说一句,按照惯例,类和接口以Java中的大写字母开头,而方法和变量以小写字母开头。遵循惯例有助于其他人理解您的代码。
答案 2 :(得分:1)
我采用了不同的方法来解决它(但你们都是对的,树的初始化是问题)。我从for循环中取出第一个节点,用第一个数据点初始化树,如下所示:
treenode T1=new treenode(n);
for(j=1;j<m;j++){
n=sc.nextInt();
T1.insert(T1, n);
}
现在一切似乎都在顺利进行。谢谢!