【问题标题】:How to fix it in BST insertion and let the insertion function work如何在 BST 插入中修复它并让插入功能工作
【发布时间】:2020-05-03 08:34:56
【问题描述】:

The code showed in Visual StudioInsertBSTNode 函数错误。但我不知道如何解决它。要求是不要改变函数的类型。

树节点

 class TreeNode{   
    public:
    int data;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int x): data(x), left(NULL), right(NULL){}
    };

插入BST节点

void InsertBSTNode(TreeNode* &root, int val){
// Input your code here.
if (root==NULL){
    root->data=val;
    root->left=root->right=NULL;}
else if(val<root->data)
    root->left=InsertBSTNode(root->left,val);//error
else if(val>root->data)
    root->right=InsertBSTNode(root->right,val);//error
return root;//error

};

【问题讨论】:

  • 很简单,你把你的函数写成void InsertBSTNode(...) void 函数没有返回值。但是在你的代码中你确实有一个返回值,因为你说return root;。要么编写一个不返回值的函数,要么将 void 替换为函数的返回类型。您的选择。
  • 问题是在需要递归时如何写一个没有返回的函数。
  • Recusrive 函数不必有返回类型。这不是你递归调用函数的问题。如果你想要一个 void recusive 函数,那么只需修复三个错误,删除 root-&gt;left=root-&gt;right=return root;
  • 顺便说一句,这是一个明显的错误if (root==NULL){ root-&gt;data=val; root-&gt;left=root-&gt;right=NULL;} 你正在取消引用一个 NULL 指针。
  • 感谢您的指正,但如果我删除所有这些,插入仍然不起作用。

标签: c++ data-structures binary-search-tree


【解决方案1】:

这就是我认为你正在尝试编写的代码

void InsertBSTNode(TreeNode* &root, int val) {
    if (root == NULL) {
        root = new TreeNode;
        root->data=val;
        root->left=root->right=NULL;
    }
    else if (val<root->data)
        InsertBSTNode(root->left,val);
    else
        InsertBSTNode(root->right,val);
}

我已经修复了返回值的无效使用,并且通过在您执行插入的位置分配一个节点来修复 NULL 指针错误。

【讨论】:

  • 我以前试过这个,但是递归的时候好像是栈溢出了。
  • @FutamonoMyo 这表明您的树已损坏。如果您查看该函数,如果树中有一个循环,它只能无限递归。左侧或右侧节点之一指向树的上方。
  • 非常感谢您的帮助!如果“new TreeNode”更改为“new TreeNode(val)”,您的代码就可以工作。很抱歉打扰您这么多次!
  • @FutamonoMyo 很高兴为您提供帮助,我之前没有看过您的 TreeNode 课程。显然你现在也可以删除root-&gt;data=val; root-&gt;left=root-&gt;right=NULL;,因为所有这些都是在构造函数中完成的。
【解决方案2】:

这是问题的解决方案。感谢@john 的帮助!

void InsertBSTNode(TreeNode* &root, int val){
if (root==NULL){
    root = new TreeNode(val);
    root->data=val;
    root->left=root->right=NULL;}
else if(val<root->data)
    InsertBSTNode(root->left,val);
else if(val>root->data)
    InsertBSTNode(root->right,val);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多