我用 C++ 写了一个方法来打印树 class 的预序,但它显示分段错误

I wrote a method in C++ to print preorder of tree class but it shows segmentation error

#include<iostream>
using namespace std;

class tree
{
    public:
    int data;
    tree *left;
    tree *right;

    tree* add_left(int data)
    {
        tree *t = new tree;
        left = t;
        t->left = NULL;
        t->right = NULL;
        t->data = data;
        return t;
    }


    tree* add_right(int data)
    {
        tree *t = new tree;
        right = t;
        t->left = NULL;
        t->right = NULL;
        t->data = data;
        return t;
    }


    void preorder()
    {
        if(left==NULL && right==NULL)
            cout<<data<<" ";
        else
        {
        cout<<data<<" ";
        left->preorder();
        right->preorder();
        }
    }
};
int main()
{
    tree *a = new tree;
    a->data = 10;
    tree *t = a->add_left(15);
    tree *b = a->add_right(20);
    tree *ne = t->add_left(30);
    a->preorder();
    return 0;
}

它只是打印出来 10 15 30 然后分割错误。 它是一个二叉树。 Add left 和 right 分别在树的左侧和右侧添加节点。 preorder应该是10 15 30 20,但是不知为什么,没有打印20。

您的代码崩溃是因为 right 在您对其调用 preorder() 时为空,将 if(left==NULL && right==NULL) 更改为 if(left==NULL || right==NULL) 或进行其他检查以避免空指针取消引用。

函数id的逻辑不正确。当当前指针等于nullptr即左指针或右指针为空指针时可以调用它。

按以下方式重写函数

void preorder() const
{
    cout << data << " ";
    if ( left ) left->preorder();
    if ( right ) right->preorder();
}

如果为你的树调用这个成员函数那么输出将是

10 15 30 20

注意函数是用修饰符const声明的,因为它不会改变树。

更灵活的函数定义可以如下所示

std::ostream & preorder( std::ostream &os = std::cout ) const
{
    os << data << " ";
    if ( left ) left->preorder();
    if ( right ) right->preorder();

    return os;
}

在这种情况下,您可以将列表写入文件。

像这样更改您的 tree::preorder 方法:

void preorder()
{
    cout<<data<<" ";

    if(left)
    {
     left->preorder();   
    }

    if(right)
    {
     right->preorder();   
    }
}