我编写了两个C++函数来在BST中插入节点。其中一个功能是工作,一个不是

I have written two C++ functions to insert a node in BST. One of the functions is working one is not

提问人:MM1 提问时间:1/28/2022 最后编辑:Vlad from MoscowMM1 更新时间:1/28/2022 访问量:42

问:

此代码不起作用:

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

谁能说出为什么会这样。因为我认为第一个代码也应该有效。请分享您对此的见解。

C++ 递归 binary-search-tree 传递引用 函数定义

评论

0赞 Jabberwocky 1/28/2022
缺少代码的基本部分,尤其是 的类定义。请编辑并显示一个最小的可重复示例BST
0赞 Jabberwocky 1/28/2022
无论如何:第一个代码:如果你用 调用它,你用 分配内存,但这只会修改局部变量(参数是局部变量)。第二个代码:如果调用它,则会出现未定义的行为,因为您取消了对 NULL 指针的引用。所以两者看起来都不正确。但无论如何,如果没有一个最小的可重复的例子,就很难说出更多。root == 0root = new BST(d);rootroot == 0

答:

0赞 Vlad from Moscow 1/28/2022 #1

这两个函数都不正确。

例如,“work”的函数不检查传递的指针是否等于 。所以函数的第一个语句nullptr

if(root->data>d){

可以调用未定义的行为。

对传递的指针的相等性进行此类测试的第一个函数不起作用,因为它处理用作参数的原始指针值的副本。更改函数中的副本不会影响原始指针。nullptr

这就是主要区别在于,第一个函数处理指针值的副本,第二个函数通过指向原始对象的指针访问它们来处理原始对象,如本语句所示

if(root->left==NULL){
  root->left = new BST(d);

在此语句中,原始指针是通过指向它的指针访问的。leftroot

第一个函数需要通过引用接受原始指针。

也就是说,它必须像这样声明

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 如果问题得到解决,则选择最佳答案以结束问题。