(数据结构)二叉树的链式存储结构
二叉树的顺序存储的缺点
因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或少会存在空间浪费的现象
图 1 普通二叉树的转化
如上图 1,普通二叉树里只有二个元素,最好的存储方式当然是开辟相对应的空间,但是顺序存储结构却让我们不能这么做!也就是说我们此时必须花更多的空间去存储相对少的元素
二叉树的链式存储
先慢慢介绍一下链式存储的节点结构!!!
图 2 普通二叉树示意图
如上图 2 所示,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储
因此,图 2 对应的链式存储结构如下图 3 所示:
图 3 二叉树链式存储结构示意图
由上图 3 可知,采用链式存储二叉树时,其节点结构由 3 部分构成:
图 4 二叉树节点结构
此时我们直接用结构体声明一下节点的类型!!!and 头文件
#include <stdio.h>
#include <stdlib.h>typedef struct MyBiTNode{int data; // 数据域struct MyBiTNode *lchild, *rchild; // 左右孩子指针
} BiTNode;
然后根据图 3 来定义主要函数体(自行消化)
BiTNode *CreateBiTree(BiTNode *T){// 结点 1 T = (BiTNode*)malloc(sizeof(BiTNode));T->data = 1;// 结点 2T->lchild = (BiTNode*)malloc(sizeof(BiTNode));T->lchild->data = 2;T->lchild->rchild = NULL;// 结点 3T->rchild = (BiTNode*)malloc(sizeof(BiTNode));T->rchild->data = 3;T->rchild->lchild = NULL; T->rchild->rchild = NULL;// 结点 4 T->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));T->lchild->lchild->data = 4;T->lchild->lchild->lchild = NULL;T->lchild->lchild->rchild = NULL;return T;
}int main() {BiTNode *Tree = NULL; // 结构体指针指向空 Tree = CreateBiTree(Tree); // 传入结构体指针 printf("%d\n",Tree->lchild->lchild->data); // 4 return 0;
}
但是还不能算真的实现了二叉树的链式存储(还不够完善)
在某些实际场景中,可能需要查找某节点的父节点,这时可以在节点结构中再添加一个指针域,用于各个节点指向其父亲节点
优化后的链式存储结构如下图 5 所示(通常称为三叉链表):
图 5 优化后二叉树的链式存储结构
此时我们直接用结构体声明一下节点的类型!!!and 头文件
#include <stdio.h>
#include <stdlib.h>typedef struct MyBiTNode{int data; // 数据域struct MyBiTNode *lchild, *rchild; // 左右孩子指针struct MyBiTNode *parent; // 父指针
} BiTNode;
然后根据图 5 来定义主要函数体(自行消化)
BiTNode *CreateBiTree(BiTNode *T){// 结点 1 T = (BiTNode*)malloc(sizeof(BiTNode));T->data = 1;T->parent = NULL;// 结点 2T->lchild = (BiTNode*)malloc(sizeof(BiTNode));T->lchild->data = 2;T->lchild->rchild = NULL;T->lchild->parent = T;// 结点 3T->rchild = (BiTNode*)malloc(sizeof(BiTNode));T->rchild->data = 3;T->rchild->lchild = NULL; T->rchild->rchild = NULL;T->rchild->parent = T;// 结点 4 T->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));T->lchild->lchild->data = 4;T->lchild->lchild->lchild = NULL;T->lchild->lchild->rchild = NULL;T->lchild->lchild->parent = T->lchild;return T;
}int main() {BiTNode *Tree = NULL; // 结构体指针指向空 Tree = CreateBiTree(Tree); // 传入结构体指针 printf("%d\n",Tree->lchild->lchild->parent->data); // 2return 0;
}
(数据结构)二叉树的链式存储结构相关推荐
- 二叉树的链式存储结构--二叉链表
1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...
- C语言手写二叉树(链式存储结构)
C语言手写二叉树(链式存储结构) 二叉树结构 二叉树基本运算 代码 图例(main函数执行过程如下:) 阶段I 阶段II 阶段III 阶段IV 阶段V 先序遍历输出过程 二叉树结构 二叉树可以用顺序存 ...
- 二叉树的链式存储结构
文章目录 前言 正文 总结 前言 上一节讲了二叉树的顺序存储,通过学习你会发现,其实二叉树并不适合用数组存储,因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或多会存在空间浪费的现象. ...
- 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树
二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...
- 二叉树的链式存储结构(线索二叉树)
一.链式存储结构 由于顺序存储二叉树的空间利用率较低,因此二叉树一般都采用链式存储结构,用链表结点来存储二叉树中的每个结点.在二叉树中,结点结构通过包括若干数据域和若干指针域,二叉链表至少包含3个域: ...
- 数据结构学习笔记——链式存储结构实现栈(链栈)
目录 一.链栈的定义 二.链栈的初始化 三.判断链栈是否为空栈 四.进栈(插入操作) 五.出栈(删除操作) 六.读取链栈的栈顶元素 七.链栈的建立 八.链栈的遍历输出 链式存储结构实现栈完整代码 一个 ...
- 数据结构二叉树的链式存储
typedef struct BiTNode{int data;struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;//定义一棵空树 BiTree r ...
- 【数据结构】 实验报告10 顺序、链式存储结构的二叉树递归遍历、层次遍历求高度
一.实验目的和要求 (源码在最后) 要求: 两种及以上存储结构(建议 顺序存储结构和链式存储结构各一).两种及以上方法(建议 递归遍历和层次遍历方法各一).分析各代码性能. 抽象数据类型(二叉树)独立 ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
最新文章
- CentOS7 设置用户密码规则
- Red and Black---DFS深度优先算法
- matlab 图像读取默认值,实验一MATLAB数字图像处理
- Java中implies_boolean implies(Permission p)
- 王者归来!C语言击败Python勇夺“2019年度编程语言”冠军
- Impala SQL 语言参考
- 机器学习 Machine Learning- 吴恩达Andrew Ng Week2-Octave
- 约翰·冯·诺依曼:一个向上帝买了挂的男人!!
- SpringBoot+FreeMarker实现单据打印功能
- jdk10安装及环境变量配置
- 算法中快慢指针的应用(Java)
- 2、金融量化分析简介
- 人机交互技术课程实验报告《社交点评APP》系统移动界面分析报告
- vm virtualbox识别U盘并挂载
- 百度推广关键词如何出价
- 使用C#自带的ReportViewer控件生成报表
- linux代码怎么运行gedit,Linux中gedit命令起什么作用呢?
- 以前做的flash相册
- My Eighty-seventh Page - 买卖股票的最佳时机 - By Nicolas
- linux 之 ps命令介绍