释放二叉树C的内存

时间:2012-02-07 17:46:56

标签: 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);
}

6 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:8)

由于它是一棵树,你应该采用递归方法。

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

答案 2 :(得分:3)

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);
     }}

检查seg故障和内存泄漏的一种很酷的方法是使用

valgrind --leak-check=full ./yourProgram

答案 3 :(得分:2)

深度优先搜索最适合此

答案 4 :(得分:1)

当你说“最好”时你的意思是“正确”(即,不会因访问释放的内存而导致混乱)或“最有效”或什么?

就正确性而言:任何你喜欢的东西,只要你在释放数据后注意不要访问数据。明显最简单的方法(我不会明确说明,因为这看起来有点像家庭作业:-)但如果你想尽可能少编写代码,那就是你要做的事情[编辑添加:这是“cnicutar”发布的内容;我希望它毕竟不是功课!])工作正常。

通过适当匹配释放顺序和分配顺序,您可以获得更高效的结果(空间或时间),但细节取决于您的内存分配器,您可能不应该关心。

答案 5 :(得分:0)

    int IndexOfNearest(double[] data, double v)
    {
        int pos = Array.BinarySearch(data, v);

        if (pos >= 0) return pos;  // exact match, will be rare for doubles

        pos = -pos - 1;  // convert to index-after

        if (pos < 1) return pos;
        if (pos >= data.Length) return pos-1;

        // between 2 values, get the nearest
        if (Math.Abs(data[pos-1] - v) < Math.Abs(data[pos] - v))
        {
            pos -= 1;
        }

        return pos;
    }
<块引用>

在这个函数中传递根,它将释放所有树使用的堆内存