我用 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();
}
}
#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();
}
}