二进制搜索树输出

时间:2011-07-30 00:46:53

标签: c++

我无法输出二叉搜索树。我必须构建树,然后将树中的所有双精度数放入向量中,然后按顺序输出该向量。我遇到的问题是将它放入向量并输出它。当我输出树时,一切都按预期工作。该向量应该被排序,并且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;
}

1 个答案:

答案 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()