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

二进制搜索树在结果中包含0(Java),java,binary-search-tree,Java,Binary Search Tree,我对Java比较陌生,目前正在学习如何在Java中实现树,特别是二进制搜索树。现在,我所做的大部分工作都很好(按序和按序遍历、交换节点等),除了一个重要的细节:0被添加到我的树中,尽管我从未插入它。换句话说,当我调用45921004的顺序遍历时,我得到024945100。以下是相关代码: 从主要功能: Scanner sc=new Scanner(System.in); int m, n, j; treenode T1=new treenode(); System.out.println("Ho

我对Java比较陌生,目前正在学习如何在Java中实现树,特别是二进制搜索树。现在,我所做的大部分工作都很好(按序和按序遍历、交换节点等),除了一个重要的细节:0被添加到我的树中,尽管我从未插入它。换句话说,当我调用45921004的顺序遍历时,我得到024945100。以下是相关代码:

从主要功能:

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

是的,我知道,我需要将类名改为Treenode,这样它就以大写字母开头;我很快就会做的

treenode T1=new treenode();
这一行创建了一个没有数据值的根节点(默认值为0),因此始终将0作为树的根

treenode T1=new treenode();
这一行创建了一个没有数据值的根节点(默认值为0),因此始终将0作为树的根

treenode T1=new treenode();
这一行创建了一个没有数据值的根节点(默认值为0),因此始终将0作为树的根

treenode T1=new treenode();
这一行创建了一个没有数据值的根节点(默认值为0),因此始终将0作为树的根

treenode T1=new treenode();
这将创建值为0的节点,而不是空树。表示一棵空树是很棘手的;值
null
不适用于当前实现,因为它调用
T1.insert()
,这将引发空指针异常

一个选项是通过将
static
修饰符添加到声明中,并将调用更改为

T1 = treenode.insert(T1, n);
对于
inoorder()
,必须执行类似的操作,否则调用方需要显式的null检查

另一个选项是创建一个包装类,
Tree
,它有一个根节点(可以是
null
)。这将使外部接口更干净:

T1.insert(n);
T1.Inorder();

另外,按照惯例,Java中的类和接口以大写字母开头,而方法和变量以小写字母开头。遵循约定有助于其他人理解您的代码

这将创建值为0的节点,而不是空树。表示一棵空树是很棘手的;值
null
不适用于当前实现,因为它调用
T1.insert()
,这将引发空指针异常

一个选项是通过将
static
修饰符添加到声明中,并将调用更改为

T1 = treenode.insert(T1, n);
对于
inoorder()
,必须执行类似的操作,否则调用方需要显式的null检查

另一个选项是创建一个包装类,
Tree
,它有一个根节点(可以是
null
)。这将使外部接口更干净:

T1.insert(n);
T1.Inorder();

另外,按照惯例,Java中的类和接口以大写字母开头,而方法和变量以小写字母开头。遵循约定有助于其他人理解您的代码

这将创建值为0的节点,而不是空树。表示一棵空树是很棘手的;值
null
不适用于当前实现,因为它调用
T1.insert()
,这将引发空指针异常

一个选项是通过将
static
修饰符添加到声明中,并将调用更改为

T1 = treenode.insert(T1, n);
对于
inoorder()
,必须执行类似的操作,否则调用方需要显式的null检查

另一个选项是创建一个包装类,
Tree
,它有一个根节点(可以是
null
)。这将使外部接口更干净:

T1.insert(n);
T1.Inorder();

另外,按照惯例,Java中的类和接口以大写字母开头,而方法和变量以小写字母开头。遵循约定有助于其他人理解您的代码

这将创建值为0的节点,而不是空树。表示一棵空树是很棘手的;值
null
不适用于当前实现,因为它调用
T1.insert()
,这将引发空指针异常

一个选项是通过将
static
修饰符添加到声明中,并将调用更改为

T1 = treenode.insert(T1, n);
对于
inoorder()
,必须执行类似的操作,否则调用方需要显式的null检查

另一个选项是创建一个包装类,
Tree
,它有一个根节点(可以是
null
)。这将使外部接口更干净:

T1.insert(n);
T1.Inorder();


另外,按照惯例,Java中的类和接口以大写字母开头,而方法和变量以小写字母开头。遵循约定有助于其他人理解您的代码。

我采用了不同的方法来解决它(但你们都是对的,树的初始化是问题所在)。我从for循环中取出第一个节点,用第一个数据点初始化树,如下所示:

treenode T1=new treenode(n);
for(j=1;j<m;j++){
  n=sc.nextInt();
  T1.insert(T1, n);
}
treenodet1=新的treenode(n);

对于(j=1;j我采用了不同的方法来解决它(但你们都是对的,树的初始化是个问题)。我从for循环中取出第一个节点,用第一个数据点初始化树,如下所示:

treenode T1=new treenode(n);
for(j=1;j<m;j++){
  n=sc.nextInt();
  T1.insert(T1, n);
}
treenodet1=新的treenode(n);

对于(j=1;j我采用了不同的方法来解决它(但你们都是对的,树的初始化是个问题)。我从for循环中取出第一个节点,用第一个数据点初始化树,如下所示:

treenode T1=new treenode(n);
for(j=1;j<m;j++){
  n=sc.nextInt();
  T1.insert(T1, n);
}
treenodet1=新的treenode(n);

对于(j=1;j我采用了不同的方法来解决它(但你们都是对的,树的初始化是个问题)。我从for循环中取出第一个节点,用第一个数据点初始化树,如下所示:

treenode T1=new treenode(n);
for(j=1;j<m;j++){
  n=sc.nextInt();
  T1.insert(T1, n);
}
treenodet1=新的treenode(n);
对于(j=1;j