【二叉树的内存管理】创建和释放一棵二叉树

简介: 【二叉树的内存管理】创建和释放一棵二叉树

二叉树结点

首先定义一个二叉树结点的结构体

1. typedef struct MyTreeNode
2. {
3.  struct MyTreeNode* left; 
4.  struct MyTreeNode* right; 
5.  char data;
6. }MyTreeNode;

创建一棵二叉树

使用#号法创建一棵二叉树,如果没有左/右子树,则用#号代替,采取先创建根结点、然后创建左子树,最后创建右子树的方法创建二叉树(前序遍历),代码如下:

1. MyTreeNode * create_tree()
2. {
3.  MyTreeNode* node = NULL;
4.  char c;
5.  scanf("%c", &c);
6.  if (c == '#')
7.  {
8.    node = NULL;
9.  }
10.   else
11.   {
12.     node = (MyTreeNode*)malloc(sizeof(MyTreeNode));
13.     node->data = c;
14.     node->left = create_tree();
15.     node->right = create_tree();
16.   }
17.   return node;
18. }

释放一棵二叉树

因为二叉树在创建的时候,所有结点都是malloc分配的,所以需要我们通过free来实现释放二叉树的内存。在释放二叉树的内存时,一定要先释放左右子树,最后释放根结点。代码如下:

1. void free_tree(MyTreeNode* tree)
2. {
3.  if (tree != NULL)
4.  {
5.    if (tree->left != NULL)
6.    {
7.      free_tree(tree->left);
8.      tree->left = NULL;
9.    }
10.     if (tree->right != NULL)
11.     {
12.       free_tree(tree->right);
13.       tree->right = NULL;
14.     }
15.     free(tree);
16.     tree = NULL;
17.   }
18. }

算法测试

首先创建一棵二叉树如下图所示,使用本文的算法创建,并使用前序遍历打印

测试程序

1. #define  _CRT_SECURE_NO_WARNINGS 
2. #include <stdlib.h>
3. #include <string.h>
4. #include <stdio.h>
5. 
6. //树结点结构体
7. typedef struct MyTreeNode
8. {
9.  struct MyTreeNode* left; 
10.   struct MyTreeNode* right; 
11.   char data;
12. }MyTreeNode;
13. 
14. //二叉树的前序遍历
15. void preorder_traversal(MyTreeNode* tree)
16. {
17.   if (tree == NULL)
18.   {
19.     return;
20.   }
21.   printf("%c ", tree->data);
22.   preorder_traversal(tree->left);
23.   preorder_traversal(tree->right);
24. }
25. 
26. //创建一颗二叉树(先创建根,后创建左子树,再创建右子树)
27. MyTreeNode * create_tree()
28. {
29.   MyTreeNode* node = NULL;
30.   char c;
31.   scanf("%c", &c);
32.   if (c == '#')
33.   {
34.     node = NULL;
35.   }
36.   else
37.   {
38.     node = (MyTreeNode*)malloc(sizeof(MyTreeNode));
39.     node->data = c;
40.     node->left = create_tree();
41.     node->right = create_tree();
42.   }
43.   return node;
44. }
45. 
46. //释放一颗二叉树(先释放左右子树,后释放根)
47. void free_tree(MyTreeNode* tree)
48. {
49.   if (tree != NULL)
50.   {
51.     if (tree->left != NULL)
52.     {
53.       free_tree(tree->left);
54.       tree->left = NULL;
55.     }
56.     if (tree->right != NULL)
57.     {
58.       free_tree(tree->right);
59.       tree->right = NULL;
60.     }
61.     free(tree);
62.     tree = NULL;
63.   }
64. }
65. 
66. int main()
67. {
68.   MyTreeNode* tree = create_tree();
69. 
70.   printf("前序遍历:");
71.   preorder_traversal(tree);
72.   printf("\n");
73. 
74.   free_tree(tree);
75. 
76.   system("pause");
77.   return 0;
78. }

运行并输入

ABC#D###EF##G##

 


相关文章
|
2月前
|
存储 安全 Linux
【开源指南】用二叉树实现高性能共享内存管理
本文介绍了一种使用C++实现的共享内存管理方案,通过借鉴Android property的设计思路,采用二叉树结构存储键值对,提高了数据检索效率。该方案包括设置和获取接口,支持多进程/线程安全,并提供了一个简单的测试示例验证其有效性。
72 5
|
5月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
299 14
|
4月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
394 0
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
64 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
42 4
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
57 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
2月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储