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

二叉树链式存储结构

前言

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

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

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

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

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

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

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

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

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

链式存储核心思想

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

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

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

前序遍历

递归调用

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

相关推荐
非优秀程序员7 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
武子康14 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
David猪大卫14 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
vvilkim15 小时前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
lisw0519 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
阿卡好可爱20 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
一起学安全技术20 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs21 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信150413057591 天前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法