释放二叉树C的记忆

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

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

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

 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 

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

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

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

 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

深度优先搜索是最好的

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

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

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