c++ - 二叉搜索树输出

标签 c++

我在输出二叉搜索树时遇到问题。我必须构建树,然后将树中的所有 double 按顺序放入一个 vector 中,然后按顺序输出该 vector 。我遇到的问题是将其放入 vector 并输出。当我刚刚输出树时,一切都按预期进行。应该对 vector 进行排序,并且 std::vector* sort() 应该返回指向 vector 的指针。我遇到的问题是出现段错误,我不知道为什么。任何意见,将不胜感激。这是我的代码:

#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;
}

最佳答案

这里有几个问题。

首先,您永远不会定义 set 的 vector 指向。

例如:

std::vector<double>* set;
std::vector<double>::iterator it = set->begin();

Set 是一个指向 std::vector<double>指针 .当你第一次声明它时,它只是堆栈上的一个内存值,带有一些未定义的值,它指向一些未定义的地方。因此,当您在下一行取消引用它时,BOOM,您会遇到段错误,因为您正在访问操作系统分配给您的进程的允许内存之外的内存。

其次,除非您必须使用指向 std::vector 的指针对于你的家庭作业,传递对 order() 中 vector 的引用,并返回来自 sort() 的 vector 拷贝...这将使您的生活更轻松,并避免许多不调用 delete 的代码用户造成内存泄漏在你从 sort() 返回给他们的指针上.

第三,你定义了order()作为递归函数......所以你不能在函数的每次迭代中定义你的 vector 并在其中放置一个值,否则你将为每个函数调用创建一个新 vector 。所以你需要在实际 sort() 中定义你的 vector 方法,然后将 vector 作为对 order() 的引用传递方法如下:

std::vector<double> ordered_set::sort()
{
    node* ndptr = root;
    std::vector<double> set;
    order(ndptr, set);

    return set;
}

最后,您需要重新定义 order()这样就可以对树进行有序递归遍历(与先序或后序遍历相比)。这意味着它将首先递归到最左边的 child ,然后以树的最右边的 child 结束,按顺序处理每个节点:

void ordered_set::order(node* top, std::vector<double>& set)
{
    node* curr = top;

    if(curr == 0)
    {
        return;
    }

    //go to the left-most child
    order(curr->left, set);

    //at this point we've now processed all children to the 
    //left of this node ... so we can now process this node itself
    set.push_back(curr->val);

    //now process all children to the right of this node
    order(curr->right, set);

    return;
}

关于c++ - 二叉搜索树输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880349/

相关文章:

c++ - 定义明确的缩小铸型

c++ - 如果我们将 "decltype(auto) f()"用作定义中包含 "decltype(f()) result"的函数声明,会发生什么情况?

c++ - 如何防止 size_t 被解释为引用?

C++如何将非常数列表传递给需要常量列表的函数

c++ - 什么是?和 : mean in C++?

c++ - C++中的虚函数实例化有什么区别?

c++ - 如何在 Visual Studio 2012 中用 C++11 替换所有 BOOST_FOREACH?

c++ - 我可以创建一个以代码作为输入的方法吗?

c++ - 持有 boost::interprocess::scoped_lock 时 sleep 导致它永远不会被释放

c++ - 使用来自 std::vector 的参数调用可变参数模板化函数