文章目录

  • 前言
  • 正文
  • 总结

前言

上一节讲了二叉树的顺序存储,通过学习你会发现,其实二叉树并不适合用数组存储,因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或多会存在空间浪费的现象。本节我们学习二叉树的链式存储结构。


正文


图 1 普通二叉树示意图

如图 1 所示,此为一棵普通的二叉树,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储即可。因此,图 1 对应的链式存储结构如图 2 所示:

图 2 二叉树链式存储结构示意图

由图 2 可知,采用链式存储二叉树时,其节点结构由 3 部分构成(如图 3 所示):

  • 指向左孩子节点的指针(Lchild);

  • 节点存储的数据(data);

  • 指向右孩子节点的指针(Rchild);


    图 3 二叉树节点结构

表示该节点结构的 C 语言代码为:

#define TElemType inttypedef struct BiTNode
{TElemType data;    //数据域struct BiTNode *lchild;    //左孩子指针struct BiTNode *rchild;  //右孩子指针}BiTNode,*BiTree;

图 2 中的链式存储结构对应的 C 语言代码为:

#include <stdio.h>
#include <stdlib.h>
#define TElemType inttypedef struct BiTNode
{TElemType data;    //数据域struct BiTNode *lchild;    //左孩子指针struct BiTNode *rchild;  //右孩子指针}BiTNode,*BiTree;void CreateBiTree(BiTree *T)
{*T=(BiTNode*)malloc(sizeof(BiTNode));(*T)->data=1;(*T)->lchild=(BiTNode*)malloc(sizeof(BiTNode));(*T)->lchild->data=2;(*T)->rchild=(BiTNode*)malloc(sizeof(BiTNode));(*T)->rchild->data=3;(*T)->rchild->lchild=NULL;(*T)->rchild->rchild=NULL;(*T)->lchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));(*T)->lchild->lchild->data=4;(*T)->lchild->rchild=NULL;(*T)->lchild->lchild->lchild=NULL;(*T)->lchild->lchild->rchild=NULL;
}
int main()
{BiTree Tree; //创建一个结构体变量CreateBiTree(&Tree);printf("%d",Tree->lchild->lchild->data);return 0;
}

程序输出结果:

4

其实,二叉树的链式存储结构远不止图 2 所示的这一种。例如,在某些实际场景中,可能会做 “查找某节点的父节点” 的操作,这时可以在节点结构中再添加一个指针域,用于各个节点指向其父亲节点,如图 4 所示:

图 4 自定义二叉树的链式存储结构

这样的链表结构,通常称为三叉链表。

此时结构体中多了一个存放父结点的指针:

#define TElemType inttypedef struct BiTNode
{TElemType data;    //数据域struct BiTNode *lchild;    //左孩子指针struct BiTNode *rchild;  //右孩子指针struct BiTree *parent;   //指向双亲结点的指针}BiTNode,*BiTree;

利用图 4 所示的三叉链表,我们可以很轻松地找到各节点的父节点。因此,在解决实际问题时,用合适的链表结构存储二叉树,可以起到事半功倍的效果。


总结

本文对二叉树的链式存储结构进行了简单的总结,错误遗漏之处请不吝指正。

二叉树的链式存储结构相关推荐

  1. 二叉树的链式存储结构--二叉链表

    1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...

  2. C语言手写二叉树(链式存储结构)

    C语言手写二叉树(链式存储结构) 二叉树结构 二叉树基本运算 代码 图例(main函数执行过程如下:) 阶段I 阶段II 阶段III 阶段IV 阶段V 先序遍历输出过程 二叉树结构 二叉树可以用顺序存 ...

  3. (数据结构)二叉树的链式存储结构

    二叉树的顺序存储的缺点 因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或少会存在空间浪费的现象 图 1 普通二叉树的转化 如上图 1,普通二叉树里只有二个元素,最好的存储方式当然是开 ...

  4. 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树

    二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...

  5. 二叉树的链式存储结构(线索二叉树)

    一.链式存储结构 由于顺序存储二叉树的空间利用率较低,因此二叉树一般都采用链式存储结构,用链表结点来存储二叉树中的每个结点.在二叉树中,结点结构通过包括若干数据域和若干指针域,二叉链表至少包含3个域: ...

  6. 【数据结构】 实验报告10 顺序、链式存储结构的二叉树递归遍历、层次遍历求高度

    一.实验目的和要求 (源码在最后) 要求: 两种及以上存储结构(建议 顺序存储结构和链式存储结构各一).两种及以上方法(建议 递归遍历和层次遍历方法各一).分析各代码性能. 抽象数据类型(二叉树)独立 ...

  7. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  8. 3.3 栈的链式存储结构

    <?php header("content-type:text/html;charset=utf-8"); /*** 栈的链式存储结构的基本操作**包括* 1.初始化 __c ...

  9. 利用链式存储结构实现线性表

    本图文主要介绍了如何利用链式存储结构实现线性表.

最新文章

  1. 为什么大公司一定要使用DevOps?
  2. 蚂蚁金服高级技术专家徐红星 :蚂蚁金服大数据开放式创新实践
  3. 【每周CV论文】初学深度学习图像对比度增强应该要读的文章
  4. 国开专科计算机应用基础,2021年国开专科《计算机应用基础》形考任务题库大全.docx...
  5. 《编程题》组装三角形
  6. GO学习第三天——自定义包
  7. java sax解析复杂xml_SAX解析复杂的xml字符串
  8. 【Android开发日记】妙用 RelativeLayout 实现3 段布局
  9. 在libvirt中使用SanLock
  10. 世界坐标和本地坐标之间的转换
  11. 使用vscode作为golang开发环境,无法跳转代码定义
  12. 现代雷达系统分析与设计---数字中频正交采样
  13. MINT:蛋白质相互作用数据库简介
  14. “免费代理IP” 又双叒叕来了,这次无限量、更稳定。(附带使用教程)
  15. 不经艰难困苦,何来玉汝于成
  16. win10共享打印错误0x0000006_win7系统局域网无法共享惠普打印机提示0x000006be错误的解决方法...
  17. 天池竞赛-资金流入流出预测总结
  18. AjaxFileUploaderV2.1修改版
  19. 记一次android任务栈页面跳转问题
  20. BUUCTF·[WUSTCTF2020]大数计算·WP

热门文章

  1. html单词和单词之间的距离,如何给HTML页面的文本设置字符和单词间距
  2. 数据中心云安全整体解决方案
  3. pygame游戏进行声音添加的方法
  4. vc++ 自定义消息和WM_NOTIFY消息实现
  5. 搜狗输入法如何登出退出登录和截图识别
  6. PyQt里QTdesigner的设置与UI文件转Python的方法
  7. 浏览器是如何工作的 - How Browser works
  8. 集成聚类之EAC方法
  9. 右上3慢性根尖周炎急性发作伴发眶下间隙感染治疗病例展示
  10. 点亮你的LCD!(linux原子哥)