以下是使用java的二进制搜索树的简单实现。但是,代码总是输出“BST空!!”尽管插入元素。我哪里错了?我怀疑我的递归出错了。非常感谢任何帮助。
public class BinarySearchTree {
NODE root;
BinarySearchTree(){
root = null;
}
void insert(NODE nodeptr,int key){
if(root == null){
nodeptr = new NODE(key);
return;
}
if(nodeptr == null){
nodeptr = new NODE(key);
return;
}
if(key <= nodeptr.data){
insert(nodeptr.left,key);
}
else{
insert(nodeptr.right,key);
}
}
void inorder(NODE nodeptr){
if(nodeptr == null){
System.out.println("BST empty!!");
return;
}
inorder(nodeptr.left);
System.out.println(nodeptr.data + " ");
inorder(nodeptr.right);
}
/*driver program*/
public static void main(String args[]){
int[] a = {20,30,40,24,39};
BinarySearchTree bst = new BinarySearchTree();
for (int i: a){
bst.insert(bst.root,i);
}
bst.inorder(bst.root);
}
}
class NODE{
int data;
NODE left,right;
NODE(int data){
this.data = data;
left = null;
right = null;
}
}
答案 0 :(得分:5)
您的insert
方法永远不会为根分配值,因此它保持为空。
如果我理解您的代码,您的插入内容应如下所示:
void insert(NODE nodeptr,int key){
if(root == null){
root = new NODE(key);
return;
}
if(nodeptr == null){
insert (root, key);
return;
}
if(key <= nodeptr.data){
if (nodeptr.left != null)
insert(nodeptr.left,key);
else
nodeptr.left = new NODE(key);
}
else{
if (nodeptr.right != null)
insert(nodeptr.right,key);
else
nodeptr.right = new NODE(key);
}
}
root
为空,请忽略传递的nodeptr
并将key
放在树的根目录。nodeptr
为空,请尝试从树的根开始插入新密钥。nodeptr.left
或nodeptr.right
,就必须将新key
放在那里,因为如果再进行一次递归调用,则会将一个空节点传递给它,递归永远不会结束。答案 1 :(得分:1)
从Erans扩展回答您可以将其更改为:
public void insert(int key){
if(root == null){
root = new NODE(key);
return;
}
insert(root,key)
}
private void insert(NODE nodeptr,int key){
if(key <= nodeptr.data){
if(nodeptr.left == null){
nodeptr.left = new NODE(key)
}
else {
insert(nodeptr.left,key);
}
}
else{
if(nodeptr.right == null){
nodeptr.right = new NODE(key)
}
else {
insert(nodeptr.right,key);
}
}
}
编辑:因为他现在添加了自己的代码,这只是你更喜欢什么样的风格。单个方法或两个方法,公共方法只有一个参数。
答案 2 :(得分:0)
我希望我的插入方法是这样的。最后工作了。谢谢大家的宝贵时间。
NODE insert(NODE nodeptr,int key){
if(nodeptr == null){
nodeptr = new NODE(key);
}
else if(key <= nodeptr.data){
nodeptr.left = insert(nodeptr.left,key);
}
else{
nodeptr.right = insert(nodeptr.right,key);
}
return nodeptr;
}
我会从这样的主要内容调用insert方法:
bst.root = bst.insert(bst.root,i);