这是我第一次使用树木。我写了一个c ++代码,但它说Segmentation fault (core dumped)
,据我搜索,这个错误来自访问可能为NULL的内存位置。我尝试使用'new'关键字,因为在c ++中应该避免使用malloc(),但我仍然无法在代码中解决这个问题。
# include<iostream>
using namespace std;
struct node
{
int data;
node *left;
node *right;
}*next;
int k=0;
void tree(int i,/*struct*/ node *next = new node)
{
++k; --i;
if (i==0)
return;
//next = new node;
next->data = k*k;
next->left = NULL;
next->right = NULL;
tree(i, next->left);
tree(i, next->right);
return ;
}
void display (node* next)
{
cout<<next->data<<" ";
if (next->left!=NULL)
{
display(next->left);
display(next->right);
}
}
int main()
{
int h;
cout<<"Enter the expected height of tree : ";
cin>>h;
node *root;
root = new node;
root->data=0;
root->left=NULL;
root->right=NULL;
tree(h, (root->left));
tree(h, (root->right));
cout<<root->data<<" ";
display(root->left);
display(root->right);
return 0;
}
答案 0 :(得分:1)
此代码存在严重问题。特别是,在这里:
void display (node* next)
{
cout<<next->data<<" ";
if (next->left!=NULL)
{
...
}
}
您取消引用next
,而不检查它是否为空。它将为空。这足以解释您看到的错误。
我说它会因为这个而为空:
void tree(int i,/*struct*/ node *next = new node)
{
...
return ;
}
...
root->left=NULL;
...
tree(h, (root->left));
...
display(root->left);
tree
函数按值获取其第二个参数 - 这意味着它不会更改root->left
的值。然后使用null参数调用display
。我怀疑你认为void tree(int i,/*struct*/ node *next = new node)
意味着什么不是它实际意味着什么。
更重要的是,您必须通过引用和值来检查传递参数的两种方法。
更基本的是,你必须从一个小而简单的程序开始,并以小步骤进行构建,而不是一次性编写一个大型复杂程序。
答案 1 :(得分:0)
#include <iostream>
using namespace std;
struct node
{
int data;
struct node *left;
struct node *right;
};
void tree(int i, struct node **root, int k)
{
if (i < 1)
return;
*root = new struct node;
(*root)->data = k*k;
(*root)->left = NULL;
(*root)->right = NULL;
tree(i - 1, &((*root)->left), k + 1);
tree(i - 1, &((*root)->right), k + 1);
}
void display(struct node *root)
{
if (root == NULL)
return;
cout << root->data << " ";
if (root->left != NULL)
display(root->left);
if (root->right != NULL)
display(root->right);
}
int main()
{
struct node *root;
int h;
cout<<"Enter the expected height of tree : ";
cin>>h;
tree(h, &root, 0);
display(root);
return 0;
}
我认为你应该更多地了解一下指针是如何工作的:http://www.tutorialspoint.com/cprogramming/c_pointers.htm
当您调用tree(h, root->left)
时,实际上只发送指针值&#34; NULL&#34; == 0x0。因为你想为它分配内存,你应该发送一个指针的引用。因此&amp; root和&amp;((* root) - &gt; left)。在显示功能中,您必须检查左侧和右侧的NULL值。
上面的代码只是改进了,并没有处理任何内存释放,能够做到这一点,遍历树并在所有叶子上使用delete并让你回到root。