我正在尝试使用递归将新节点插入BST 但插入后我失去了链接 有序遍历表明程序只能访问根节点 这是我的计划
BST课程
class bst
{
struct node
{
struct node *lchild;
int info;
struct node *rchild;
}*start;
public:
bst();
void insert(int num,struct node *start);
void search(int num,struct node *start);
void display();
void inorder(node *start);
struct node *getRoot(){
return start;
}
};
插入功能
void bst :: insert(int num,struct node *ptr)
{
if(ptr == NULL)
{
ptr = new node;
ptr->info = num;
ptr->lchild = NULL;
ptr->rchild = NULL;
if(start == NULL)
start = ptr;
return;
}
else if(num < ptr->info)
{
insert(num,ptr->lchild);
}
else if(num > ptr->info)
{
insert(num,ptr->rchild);
}
else
{
cout << "Duplicate element \n";
return;
}
}
主要功能
int main()
{
bst S;
int option,key;
cout << "Enter an element\n";
cin >> key;
S.insert(key,S.getRoot());
}
如何在不更改插入函数的返回类型的情况下维护正确的链接?
答案 0 :(得分:1)
start
是否已在某处初始化为NULL
?
此外,当start
不是NULL
时,您永远不会将新创建的节点链接到树中:
if(ptr == NULL)
{
ptr = new node;
ptr->info = num;
ptr->lchild = NULL;
ptr->rchild = NULL;
if(start == NULL)
start = ptr;
return;
}
您应检查节点的子节点是否为NULL
,然后在其中链接新节点。我认为你的递归太过分了。
答案 1 :(得分:0)
将您的start
初始化为NULL
bst()
{
start=NULL;
}
答案 2 :(得分:0)
您需要通过引用传递root。
主要功能
S.insert(key,&S.getRoot());
插入功能
void bst :: insert(int num,struct node **ptr)
{
if(*ptr == NULL)
{
*ptr = new node;
(*ptr)->info = num;
(*ptr)->lchild = NULL;
(*ptr)->rchild = NULL;
//if(start == NULL) //No need for this statement
// start = *ptr; //No need for this statement
return;
}
else if(num < *ptr->info)
{
insert(num,&((*ptr)->lchild));
}
else if(num > *ptr->info)
{
insert(num,&((*ptr)->rchild));
}
else
{
cout << "Duplicate element \n";
return;
}
}