我是否需要在BinaryTree中释放根或数据?

时间:2017-12-05 10:11:53

标签: c pointers malloc binary-tree

我有一个问题......如果我有这样的Binarytree:

typedef struct
{
   char* text;
   char* line;
   struct Node* left;
   struct Node* right;
}Node

并有一个启动功能:

Node *start(Node* ptr)
{
if(ptr == NULL)
{
 ptr = (Node*)malloc(sizeof(Node));
    ptr->text = "some text";
    ptr->line = "another text";
    ptr->left = NULL;
    ptr->right = NULL;
}
return (ptr);
}

在二进制树中添加左子项的功能,如果root不为空,在这里我必须给出我的文本和行动态内存。

  Node* addNode(Node* ptr)
  {
    if(ptr != NULL)
    {
    Node* leftNode = (Node*)malloc(sizeof(zeiger));
    char* text = (char*) malloc(100*sizeof(char));
    char* line = (char*) malloc(100*sizeof(char));

    line = "some text 2";
    text = "another text";
    if(leftNode !=NULL)
    {
        leftNode->text = text;
        leftNode->line = line;
        leftNode->right = NULL;
        ptr->left = leftNode;
    }
    return leftNode;
}
return ptr;

}

现在问题是我想要释放树中的所有东西,所以我有一个像这样的函数,如果左或右或root不是NULL就自称。所以我看到一些代码,我应该释放根,而不是数据。

void freeTree(Node* root)
{
  while(1)
  {
   if(root == NULL)
  {
  break;
}
else if (root->left != NULL)
{
  freeTree(root->left);
  root->left = NULL;
}
else if (root->right) {
        freeTree(root->right);
  root->right = NULL;
}
else
  {
  free(root);
  }
 }
}

MAIN.C

int main(int argc, char const *argv[]) {

Node* root = NULL;
root = start(root);
root = addNode(root);
freeTree(root);
return 0;
}

1 个答案:

答案 0 :(得分:2)

你不应该释放你没有malloc的记忆。

这里第一个节点的指针指向一个字符串文字。你不应该打电话给free()

您还应该在初始节点中分配内存,然后尝试复制该字符串文字。现在每个节点都相似。

现在你释放每个节点的内存。首先要做哪个节点?邮政订单遍历将是一个。首先是孩子,然后父母将被释放,否则你将有内存泄漏。

void freeTree(Node *root){
   if( root ){
     freeTree(root->left);
     freeTree(root->right);
     free(root->text); // root->text was allocated calling malloc
     free(root->line); // same for root->line
     free(root);
   }
}

root->文本已分配,调用malloc - 您必须动态分配才能在其上调用free。在您的代码中,初始节点text指向字符串文字。你需要按照回答中提到的那样正确地做 - (分配 - 并将字符串复制到新分配的内存中)。