【问题标题】:Altering a struct that has been passed by caller? (constructing binary search tree from preorder)更改调用者传递的结构? (从前序构造二叉搜索树)
【发布时间】:2020-08-02 23:36:47
【问题描述】:

我已经用 Java 编程几年了,我正在尝试学习 C++。

我想要一些关于这段代码具体有什么问题的提示,但更重要的是,我想知道我是否正确地处理了这个问题。 任务是将TreeNode *root返回给BST,给定vector<int>& preorder

我的总体思路很清楚:递归查找左右边界,并使用 this 构建树。

我试过了:

  1. 使用返回 TreeNode * 的辅助方法 - 这导致了 AddressSanitizer: heap-buffer-overflow 错误

  2. 将帮助方法转换为返回类型void,并将TreeNode *ptr 作为参数传递——这会导致runtime error: member access within null pointer of type 'TreeNode' 错误

我的代码:

class Solution {
public:
    TreeNode* bstFromPreorder(vector<int>& preorder) {
        TreeNode* root = new TreeNode();
        constructSubtree(preorder, root, 0, preorder.size());
        return root;
    }
private:
    void constructSubtree(vector<int>& preorder, TreeNode* ptr, int start, int end) {
        if(start == -1 || start >= end) {
            return;
        }
        ptr->val = preorder[start];
        int split = -1; // first idx where preorder[idx] > preorder[start]
        for(int i = start + 1; i < end; ++i) {
            if(preorder[i] > preorder[start]) {
                split = i;
                break;
            }
        }
        constructSubtree(preorder, ptr->left, start + 1, split);
        constructSubtree(preorder, ptr->right, split, end);
    }
};

一些示例输入:[8,5,1,7,10,12]

谁能解释我做错了什么?

正如我所说,我仍在学习 C++,我也很想听听有关使用指针(以及谁负责释放指针内容)的一般提示。

【问题讨论】:

  • 我正在尝试学习 C++——我建议阅读有关如何使用 C++ 编程的优秀 C++ 书籍,而不是使用一些在线法官网站上的问题并摸索用指针。 C++ 是学习起来最复杂的语言之一——你不能通过回答树问题来学习该语言。
  • 感谢您的建议。我的《A Tour of C++》正在制作中,但发货延迟了。

标签: c++ pointers binary-search-tree preorder


【解决方案1】:

constructSubtree() 的ptr 应该在调用之前分配,因为它没有在函数中分配。所以你应该在递归调用函数constructSubtree()之前分配ptr->left和ptr->right。 下面是工作代码(虽然不是那么整洁)

class   TreeNode
{
public:
    TreeNode() { val = 0; left = nullptr; right = nullptr; }
    int val;
    TreeNode    *left;
    TreeNode    *right;

    void    print()
    {
        if(left != nullptr)
            left->print();
        std::cout << val << std::endl;
        if(right != nullptr)
            right->print();
    }

    void    remove()
    {
        if(left != nullptr)
            left->remove();
        if(right != nullptr)
            right->remove();
    }
};

class Solution {
public:
    TreeNode* bstFromPreorder(std::vector<int>& preorder) {
        constructSubtree(preorder, &root, 0, preorder.size());
        return root;
    }
private:
    TreeNode    *root;
    void constructSubtree(std::vector<int>& preorder, TreeNode** ptr, int start, int end) {
        if(start == -1 || start >= end) {
            return;
        }
        *ptr = new TreeNode();
        (*ptr)->val = preorder[start];
        int split = -1; // first idx where preorder[idx] > preorder[start]
        for(int i = start + 1; i < end; ++i) {
            if(preorder[i] > preorder[start]) {
                split = i;
                break;
            }
        }
        if(split != -1)
        {
            constructSubtree(preorder, &((*ptr)->left), start + 1, split);
            constructSubtree(preorder, &((*ptr)->right), split, end);
        }
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多