二进制搜索树在结果中包含0(Java)

时间:2014-04-13 02:49:00

标签: java binary-search-tree

我对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,所以它以大写字母开头;我很快就会这样做。

3 个答案:

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

现在一切似乎都在顺利进行。谢谢!