我无法输出二叉搜索树。我必须构建树,然后将树中的所有双精度数放入向量中,然后按顺序输出该向量。我遇到的问题是将它放入向量并输出它。当我输出树时,一切都按预期工作。该向量应该被排序,并且std :: vector * sort()应该返回一个指向向量的指针。我遇到的问题是我遇到了分段错误,我不知道为什么。任何意见,将不胜感激。这是我的代码:
#include <vector>
struct ordered_set {
private:
class node {
public:
double val;
node* left;
node* right;
node(double v, node* l, node* r): val(v), left(l), right(r) { }
};
node* root;
int size;
public:
ordered_set();
void insert(double x);
std::vector<double>* sort();
std::vector<double>* order(node*);
};
#include <vector>
#include <iostream>
#include "ordered_set.hpp"
ordered_set::ordered_set()
{
root = 0;
size = 0;
}
void ordered_set::insert(double x)
{
node* data = new node(x, 0, 0);
node* parent;
parent = 0;
if(root == 0)
root = data;
else
{
node* curr = root;
while (curr)
{
parent = curr;
if(data->val > curr->val)
curr = curr->right;
else
curr = curr->left;
}
if(data->val < parent->val)
parent->left = data;
else
parent->right = data;
}
++size;
}
std::vector<double>* ordered_set::sort()
{
node* ndptr = root;
return order(ndptr);
}
std::vector<double>* ordered_set::order(node* top)
{
node* curr = top;
std::vector<double>* set;
std::vector<double>::iterator it = set->begin();
if(curr != 0)
{
order(curr->left);
set->insert(it, curr->val);
++it;
order(curr->right);
}
else return set;
}
答案 0 :(得分:1)
这里有几个问题。
首先,您永远不会定义set
指向的向量。
例如:
std::vector<double>* set;
std::vector<double>::iterator it = set->begin();
将指针设置为std::vector<double>
。当你第一次声明它时,它只是堆栈上的一个内存值,带有一些未定义的值,它指向一些未定义的位置。因此,当您在下一行(BOOM)取消引用它时,您会收到分段错误,因为您正在访问操作系统已分配给您的进程的允许内存之外的内存。
其次,除非你必须使用指向std::vector
作为家庭作业的指针,否则在order()
中传递对向量的引用,并返回来自sort()
的向量...它将使您的生活变得更加轻松,同时避免代码用户的内存泄漏,许多人不会在{{1}返回到它们的指针上调用delete
}}
第三,您已将sort()
定义为递归函数...因此您无法在函数的每次迭代中定义向量并在其中放置值,否则您将创建每个函数调用的新向量。因此,您需要在实际order()
方法中定义向量,然后将向量作为对sort()
方法的引用传递,如下所示:
order()
最后,您需要重新定义std::vector<double> ordered_set::sort()
{
node* ndptr = root;
std::vector<double> set;
order(ndptr, set);
return set;
}
,以便对树进行有序递归遍历(与预订或后序遍历相比)。这意味着它将以递归方式首先转到最左边的子节点,并以树的最右边的子节点结束,按顺序处理每个节点:
order()