释放二叉树C的内存

mar*_*ary 4 c free binary-tree

我想从我分配的二叉树中释放内存,这样做最好的遍历是什么?

typedef struct Node{
struct Node * right;
struct Node * left;
void * data;
}Node;


typedef int (*cmp) (void*,void *);


Node* init(void * element){
    Node * newNode=(Node*)malloc(sizeof(Node));
    newNode->data=element;
    newNode->left=NULL;
    newNode->right=NULL;
    return newNode; 
}

void  insert(void * element, Node** root,cmp compareTo){
    if(*root==NULL){
        *root=init(element);
        return;
    }
    if(compareTo(element,(*root)->data)==1)
        insert(element,&((*root)->left),compareTo);
    else
        insert(element,&((*root)->right),compareTo);
}
Run Code Online (Sandbox Code Playgroud)

Fat*_*ror 11

考虑一下不同的遍历类型的作用,并记住,在你释放内存之后,你不再允许它访问它:

  • 预购:在访问任何儿童之前进行的操作
  • 有序:在访问左子树之后,在右子树之前执行的操作
  • 后序:访问所有子树后执行的操作

鉴于上述陈述,答案应该清楚.


Poc*_*chi 11

既然它是一棵树,你应该采用递归方法.

deallocate (node):
    //do nothing if passed a non-existent node
    if node is null
        return

    //now onto the recursion
    deallocate(left node)
    deallocate(right node)

    free node
Run Code Online (Sandbox Code Playgroud)

  • 如果您的树超大,递归调用可能会导致堆栈溢出(ahhhhhhh),在这种情况下,您会想要走不同的路线(迭代),尽管会增加时间复杂度。 (2认同)

MrP*_*es7 7

void free_tree(Node * node){
   //post-order like FatalError hinted at
       if (node != NULL) {
        free_tree(node->right);
        free(node->data); //if data was heap allocated, need to free it
        free_tree(node->left);
        free(node);
     }}
Run Code Online (Sandbox Code Playgroud)

检查段错误和内存泄漏的一种很酷的方法是使用

valgrind --leak-check=full ./yourProgram

  • 我认为这没有区别,但我希望在释放“节点”之前释放“数据”。我不得不仔细考虑你的代码,谢谢! (2认同)