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

二叉树链式存储结构

前言

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

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

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

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

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

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

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

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

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

链式存储核心思想

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

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

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

前序遍历

递归调用

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

相关推荐
lzhdim3 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ6 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛6 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
w_zero_one8 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David8 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David9 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪9 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪9 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!11 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.11 小时前
202609CSP认证P3
算法