五分钟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
图片:凡科快图
- Tensorflow动态seq2seq使用总结
- 卷积神经网络中PET/CT图像的纹理特征提取
- 深入剖析Spring(四)——AOP
- Java并发编程的艺术(十二)——线程安全
- 用 LSTM 做时间序列预测的一个小例子
- Java并发编程的艺术(十一)——线程池(2)
- Java并发编程的艺术(十)——线程池(1)
- Tensorflow on Spark爬坑指南
- Boost asio 官方教程
- 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)
- 柴毛毛大话设计模式——开发常用的设计模式梳理
- Redis源码分析(四)——Redis数据结构-整数集合
- Redis源码分析(三)——Redis数据结构-字典
- Redis源码分析(二)——Redis数据结构-链表
- 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 数组属性和方法
- 使用kepler.gl可视化地理空间数据
- 聊聊 Python 代码覆盖率工具 - Coverage
- 目标检测模型YOLO-V1损失函数详解
- 轻松学Pytorch-使用ResNet50实现图像分类
- IDEA奇淫小技巧
- [PHP框架] ThinkPHP6 介绍、安装及配置
- 【翻译】withoutboats 的 io-uring 笔记
- [Python]随机生成大量的虚拟信息测试数据(姓名,手机号,ID,家庭住址等)
- Java核心技术之动态代理
- 开源verilog仿真工具iverilog+GTKWave初体验
- [算法] 数组排序 - 冒泡排序法与直接选择排序法
- TS 设计模式01 - 工厂模式
- Spring与Mybatis的整合
- Python中的计数 - Counter类
- vue 记账本