【发布时间】:2020-08-02 23:36:47
【问题描述】:
我已经用 Java 编程几年了,我正在尝试学习 C++。
我想要一些关于这段代码具体有什么问题的提示,但更重要的是,我想知道我是否正确地处理了这个问题。
任务是将TreeNode *root返回给BST,给定vector<int>& preorder。
我的总体思路很清楚:递归查找左右边界,并使用 this 构建树。
我试过了:
使用返回
TreeNode *的辅助方法 - 这导致了AddressSanitizer: heap-buffer-overflow错误将帮助方法转换为返回类型
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