释放分配的二叉树 - C编程

时间:2013-10-24 19:37:25

标签: c malloc binary-tree

struct node {
    int data;
    struct node* left;
    struct node* right;
};

创建要插入的节点功能:

struct node* create_node(int val) {

 // Allocate space for the node, set the fields.
 struct node* temp;
 temp = (struct node*)malloc(sizeof(struct node));
 temp->data = val;
 temp->left = NULL;
 temp->right = NULL;

 return temp; // Return a pointer to the created node.
}

我的插入节点功能:

struct node* insert(struct node *root, struct node *element) {

 if (root == NULL)
   return element;
 else {

   // element should be inserted to the right.
   if (element->data > root->data) {

     // There is a right subtree to insert the node.
     if (root->right != NULL)
       root->right = insert(root->right, element);

     // Place the node directly to the right of root.
     else
       root->right = element;
   }

   // element should be inserted to the left.
   else {

     // There is a left subtree to insert the node.
     if (root->left != NULL)
       root->left = insert(root->left, element);

     // Place the node directly to the left of root.
     else
       root->left = element;
   }

   // Return the root pointer of the updated tree.
   return root;
 }
}

我将节点插入树中的主要内容:

    scanf("%d", &numCases);

    for(i=0; i<numCases;i++){

        scanf("%d", &numNodes);

        for(j=0; j < numNodes; j++){
            scanf("%d", &val);
            temp_node = create_node(val);
            my_root = insert(my_root, temp_node);
        }
// calling the function to free the tree after all nodes have been inserted
postOrderFree(my_root);

现在我的计划是使用Post顺序遍历方法来释放每个节点,但是当我尝试使用我的Post order函数时,它似乎无法正常工作。它根本不释放任何节点,并且对于我给它的每个情况,它将继续向前一个树添加节点,直到它不可避免地崩溃。

这是我试图使用的Post Order遍历函数:

void postOrderFree(struct node* root){
    if(root != NULL) {
        postOrderFree(root->left);
        postOrderFree(root->right);
        free(root->data);
    }
}

任何和所有的帮助将不胜感激,包括风格,如果有任何裁员!

2 个答案:

答案 0 :(得分:2)

由于您为节点而不是数据分配了内存,因此您不应释放节点数据,而应释放节点本身:

void postOrderFree(struct node* root){
    if(root != NULL) {
        postOrderFree( root->left );
        postOrderFree( root->right );
        free( root );
    }
}

答案 1 :(得分:1)

你的postOrderFree()函数释放了错误的东西..

应该是

 free(root);

而不是

  free(root->data);

释放'二叉树后,必须将根节点设置回NULL,否则它将是一个悬空指针。 那就是你必须这样做:

 postOrderFree(my_root);
 my_root = NULL;