我想从我分配的二叉树中释放内存,这样做最好的遍历是什么?
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);
}
答案 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;
}
<块引用>
在这个函数中传递根,它将释放所有树使用的堆内存