数据结构学习8——二叉树的销毁
2012-08-30 22:11
316 查看
构造和使用二叉树后,将二叉树的释放,需要将存储二叉树节点的内存空间释放掉,最后将二叉树置NULL。
根据前面一篇文章中二叉树的遍历可以得到启示,遍历是将节点数据元素找出来,同样利用便利的思想,也可以将节点指向的内存空间释放掉。这里需要注意的问题时,释放的先后问题,根节点必须在左子树和右子树的后面释放,因此,利用后续遍历的方法可以释放掉二叉树中多有节点的存储空间。
如下代码:
为了验证方法的正确性,利用内存泄漏检测工具valgrind进行检查
结果如下所示:
==2957== Memcheck, a memory error detector
==2957== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==2957== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==2957== Command: ./tree
==2957==
Create binary tree:
1
2
3
0
0
4
0
0
6
7
0
0
0
Pre order:
1 2 3 4 6 7
Mid order:
3 2 4 1 7 6
Post order:
3 4 2 7 6 1
==2957==
==2957== HEAP SUMMARY:
==2957== in use at exit: 0 bytes in 0 blocks
==2957== total heap usage: 6 allocs, 6 frees, 72 bytes allocated
==2957==
==2957== All heap blocks were freed -- no leaks are possible
==2957==
==2957== For counts of detected and suppressed errors, rerun with: -v
==2957== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)
从上面的结果可以看到,程序中不存在内存泄漏的问题,申请的6个堆空间全部释放(因为游6个节点所以申请了6个堆空间)。
根据前面一篇文章中二叉树的遍历可以得到启示,遍历是将节点数据元素找出来,同样利用便利的思想,也可以将节点指向的内存空间释放掉。这里需要注意的问题时,释放的先后问题,根节点必须在左子树和右子树的后面释放,因此,利用后续遍历的方法可以释放掉二叉树中多有节点的存储空间。
如下代码:
/释放二叉树的内存空间,将二叉树置空 void BTreeSetNull(BTree *tree) { if(tree==NULL) { return; } BTreeSetNull(tree->left); BTreeSetNull(tree->right); free(tree); }
为了验证方法的正确性,利用内存泄漏检测工具valgrind进行检查
$ valgrind --tool=memcheck --leak-check=full ./tree
结果如下所示:
==2957== Memcheck, a memory error detector
==2957== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==2957== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==2957== Command: ./tree
==2957==
Create binary tree:
1
2
3
0
0
4
0
0
6
7
0
0
0
Pre order:
1 2 3 4 6 7
Mid order:
3 2 4 1 7 6
Post order:
3 4 2 7 6 1
==2957==
==2957== HEAP SUMMARY:
==2957== in use at exit: 0 bytes in 0 blocks
==2957== total heap usage: 6 allocs, 6 frees, 72 bytes allocated
==2957==
==2957== All heap blocks were freed -- no leaks are possible
==2957==
==2957== For counts of detected and suppressed errors, rerun with: -v
==2957== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)
从上面的结果可以看到,程序中不存在内存泄漏的问题,申请的6个堆空间全部释放(因为游6个节点所以申请了6个堆空间)。
相关文章推荐
- 数据结构学习笔记——二叉树的存储结构
- 小蚂蚁学习数据结构(24)——求二叉树深度和度为2的节点个数代码实现
- 数据结构学习笔记7——二叉树介绍
- Java 数据结构学习 之 二叉树及相关
- 【数据结构学习笔记】——根据中缀表达式构建二叉树并输出
- 基本数据结构学习总结: 二叉树的遍历
- 数据结构学习--二叉树--二叉树遍历(1)
- 【学习点滴-数据结构-二叉树】求二叉树中某两个节点的最近公共祖先
- 数据结构学习之二叉树(理论篇)
- 【学习笔记----数据结构12-树、森林与二叉树的转换】
- 《数据结构》第五章 树和二叉树学习指南
- 严蔚敏数据结构学习笔记六.树和二叉树
- 数据结构与算法学习笔记——二叉树的初步理解
- 数据结构学习之-二叉树的定义和存储实现
- 数据结构和算法学习(8)-二叉树
- 数据结构(Java 二叉树模拟)本代码重在学习数据结构思路,代码完整性欠缺,请见谅
- 数据结构学习笔记之二叉树
- 数据结构学习笔记-森林和二叉树的转化、最优二叉树
- C语言学习历程(十八) 数据结构二叉树的创建、遍历、深度等算法
- 【学习点滴-数据结构-二叉树】和为某一值的二叉树路径~