创建给定高度的二叉树时的分段错误(核心转储)

时间:2014-06-08 10:55:43

标签: c++ tree segmentation-fault

这是我第一次使用树木。我写了一个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;
 }

2 个答案:

答案 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。