提问人:MM1 提问时间:1/28/2022 最后编辑:Vlad from MoscowMM1 更新时间:1/28/2022 访问量:42
我编写了两个C++函数来在BST中插入节点。其中一个功能是工作,一个不是
I have written two C++ functions to insert a node in BST. One of the functions is working one is not
问:
此代码不起作用:
void BST::insertNode(BST *root,int d){
if(root==NULL) {
root = new BST(d);
cout<<"Node inserted successfully\n\n";
return;
}
if(root->data>d) return insertNode(root->left,d);
if(root->data<d) return insertNode(root->right,d);
if(root->data==d){ cout<<"Node already Exists\n\n";return;}
}
此代码正在工作:
void BST::insertNode(BST *root,int d){
if(root->data>d){
if(root->left==NULL){
root->left = new BST(d);
return;
}
else return insertNode(root->left,d);
}
if(root->data<d){
if(root->right==NULL){
root->right = new BST(d);
return;
}
else return insertNode(root->right,d);
}
}
谁能说出为什么会这样。因为我认为第一个代码也应该有效。请分享您对此的见解。
答:
0赞
Vlad from Moscow
1/28/2022
#1
这两个函数都不正确。
例如,“work”的函数不检查传递的指针是否等于 。所以函数的第一个语句nullptr
if(root->data>d){
可以调用未定义的行为。
对传递的指针的相等性进行此类测试的第一个函数不起作用,因为它处理用作参数的原始指针值的副本。更改函数中的副本不会影响原始指针。nullptr
这就是主要区别在于,第一个函数处理指针值的副本,第二个函数通过指向原始对象的指针访问它们来处理原始对象,如本语句所示
if(root->left==NULL){
root->left = new BST(d);
在此语句中,原始指针是通过指向它的指针访问的。left
root
第一个函数需要通过引用接受原始指针。
也就是说,它必须像这样声明
void BST::insertNode( BST * &root, int d ){
此外,由于该函数是类的成员函数,因此它应该声明为静态函数。
也就是说,您可以在类中有两个函数。第一个是带有一个参数的公共非静态成员函数
insertNode( int d );
第二个是受保护的或私有的静态递归函数,有两个参数
static insertNode( BST * &root, int d );
第一个函数将调用第二个函数,同时传递类根目录的数据成员。
评论
0赞
MM1
1/28/2022
谢谢,现在它似乎有效。此外,我还在第二个函数中添加了第一行来检查 NULL 根。
1赞
Vlad from Moscow
1/28/2022
@MM1 如果问题得到解决,则选择最佳答案以结束问题。
评论
BST
root == 0
root = new BST(d);
root
root == 0