数据结构之树&&二叉树(四)

二叉树链式存储结构

前言

二叉树有两种主流存储方式:顺序存储(数组,适合完全二叉树 / 堆)链式存储(链表,普通二叉树首选)。 链式存储是我们写二叉树遍历、BST、AVL、红黑树的基础,不需要占用连续内存,适合形态不规则的二叉树。

一、链式存储相对顺序存储的优势

数组顺序存储二叉树原理:利用完全二叉树下标映射关系 ,根 i,左孩子2i+1,右孩子2i+2

  1. 适配任意形态二叉树,不会浪费大量空间 数组存储只适合完全二叉树。如果是单边斜树(比如只有左孩子),数组要开辟巨大容量,大量位置是空、白白占内存。 链式存储节点按需 malloc,树有多少节点就开辟多少内存,歪斜树、稀疏树都不浪费空间。
  2. 插入、删除节点代价小 数组存储如果在中间插入节点,需要移动大量元素; 链式只需要修改指针指向,不需要挪动其他节点。
  3. 节点动态分配,不受预先容量限制 数组需要提前确定最大长度,一旦扩容开销大;链式在堆上动态创建节点,树可以随时长大。

链式短板回顾:不能下标随机访问;每个节点要额外存 2 个指针,有少量额外内存开销。

二、二叉树前、中、后序遍历(递归版,链式结构)

遍历定义:根节点访问顺序区分三种遍历

  • 前序遍历:根 → 左子树 → 右子树
  • 中序遍历:左子树 → 根 → 右子树
  • 后序遍历:左子树 → 右子树 → 根

代码实现前,中,后序遍历

链式存储核心思想

每一个节点是独立的一小块内存。 一个节点包含三部分:

  1. 数据域:存放当前节点的值
  2. 左孩子指针:指向左子树节点,没有左孩子则置为NULL
  3. 右孩子指针:指向右子树节点,没有右孩子则置为NULL

因为通过指针把一个个节点串联起来,所以叫链式存储

前序遍历

递归调用

中序遍历和后续遍历于前序不同的时候输出数据的时机是不一样的

相关推荐
hansang_IR2 小时前
【题解】P4456 [CQOI2018] 交错序列(矩阵乘法)
c++·线性代数·算法
数模加油站2 小时前
26数模国赛C题|思路第3弹【顶流思路+深度攻略】
算法·数学建模·数学建模竞赛·国赛·26国赛
find1star2 小时前
LeetCode 25:K 个一组翻转链表
java·数据结构·算法·leetcode·链表·职场和发展·动态规划
ysu_03143 小时前
13-图的基础:存储与表示
数据结构·
Bmob后端云3 小时前
Bmob后端云实战|Python给备忘录接入AI摘要、文本润色功能
算法·github
小鱼干..3 小时前
CTFHub技能树-ssrf-URL Bypass
算法
chushiyunen3 小时前
动态规划、贪心算法、分治法
算法·贪心算法·动态规划
hansang_IR3 小时前
【题解】P4456 [CQOI2018] 交错序列(数学递推)
c++·算法
青少儿编程课堂3 小时前
贪心算法进阶:区间调度与最少资源整合解析
c++·python·算法·贪心·信息学竞赛·区间调度