五分钟C语言实现数据结构 之 二叉树链式存储
时间:2022-07-24
本文章向大家介绍五分钟C语言实现数据结构 之 二叉树链式存储,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
五分钟C语言实现常见数据结构 之 二叉树链式存储
引例
在开始的时候,我们会采用数组的形式来定义树的数据结构,但是一定会造成空间的浪费...
举例来说「灰色底代表被浪费的空间」
很明显的可以看到,如果采用数组连续存储的话,会有大量的空间浪费,可能有的同学感觉浪费的也不是太多。那么咱们再增加一个看看:
在这里只增加了一个节点。但是由于树本身的原因,却要浪费8个单元格,仅仅一个节点确实浪费了大量的存储空间。
由于这种情况的发生,所以,经常也会用链式存储来进行树形的设计
树的链式设计
要点:给每一个节点增加两个指针节点,指向孩子节点,避免空间的浪费
这样来看是不是就避免了某些空间的浪费
然后用这样的实现方式来用图表示上述的树形结构
很清楚的采用链式结构来说,节省了很多的空间。
可能还有同学疑问,这样不会使得增加了指针节点的空间存储吗?
是有这部分开销,但是在日常生活中,比起指针节点空间开销,数组连续存储会占用更多的空间。感兴趣的同学可以自己画图实现看看。
伪代码描述
typedef struct BinTNode{
ElementType data; //数据储存
struct BinTNode * left; //左指针
struct BinTNode * right; //右指针
}BinTNode, *BinTree;
C代码实现
下面代码是按照上述的树形结构整理的
# include <stdio.h>
# include <stdlib.h>
# define ElementType char
typedef struct BinTNode{
ElementType data;
struct BinTNode * left;
struct BinTNode * right;
} BinTNode, *BinTree;
BinTNode * CreateBinTree(BinTNode *T){
T=(BinTNode*)malloc(sizeof(BinTNode));
T->data='A';
T->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->data='B';
T->right=(BinTNode*)malloc(sizeof(BinTNode));
T->right->data='C';
T->right->left=NULL;
T->right->right=NULL;
T->left->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->data='D';
T->left->right=NULL;
T->left->left->left=NULL;
T->left->left->right=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->right->data='I';
T->left->left->right->left=NULL;
T->left->left->right->right=NULL;
return T;
}
int main() {
BinTNode * Tree;
Tree = CreateBinTree(Tree);
printf("%cn",Tree->left->left->data);
return 0;
}
很多同学说在学完了一些数据结构之后,说是实现起来难,确实课本和代码实现起来是有一点距离的
多看多理解!慢慢积累一定会有思想层面的改变!
作者:Johngo
图片:凡科快图
- 表格可在线编辑效果
- CSS侧边栏宽度不动(更改页面宽度时),内容区宽度自适应
- JS网页顶部弹出可关闭广告图层
- 未来会不会出现人类大脑与人工智能进行链接,而产生的超级大脑?
- android布局文件中android:icon="?attr/menuIconCamera"找不到对应图标路径
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(1)表结构
- Centos7修改默认网卡名(改为eth0)以及网卡启动报错RTNETLINK answers: File exists处理
- 通过企业分布式缓存共享运行时数据
- 移植SlidingMenu Android library,和安装example出现的问题解决
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(2)插入记录
- Centos中yum方式安装java
- 微信小程序新革命催生新物种新物种带来大红利!玩转行业新玩法
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(3)删除记录
- 部署Zipkin分布式性能追踪日志系统的操作记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法