二叉树的遍历和线索二叉树--二叉树的遍历

一、二叉树遍历定义

按一定规则依次访问二叉树每个结点且仅访问一次。


二、四种遍历顺序

  1. 先序遍历(根左右)

根节点 → 左子树 → 右子树

2.中序遍历(左根右)

左子树 → 根节点 → 右子树

二叉搜索树 BST 中序 = 从小到大有序序列

  1. 后序遍历(左右根)

左子树 → 右子树 → 根节点

  1. 层序遍历(层次遍历)

从上到下,从左到右,一层一层访问

队列实现


三、递归遍历代码(Java)

  1. 先序 根左右

    void pre(TreeNode root){
    if(root==null) return;
    访问root;
    pre(root.left);
    pre(root.right);
    }

  2. 中序 左根右

    void in(TreeNode root){
    if(root==null) return;
    in(root.left);
    访问root;
    in(root.right);
    }

  3. 后序 左右根

    void post(TreeNode root){
    if(root==null) return;
    post(root.left);
    post(root.right);
    访问root;
    }


四、遍历要点

  1. 已知先序 + 中序 → 唯一确定一棵二叉树

  2. 已知后序 + 中序 → 唯一确定一棵二叉树

  3. 已知先序 + 后序 → 不能唯一确定

  4. 递归遍历空间复杂度 = 树的高度(栈深度)

  5. 时间复杂度一律 O(n),每个结点访问一次


五、线索二叉树

1.普通二叉链表:

  • n 个结点,一共有2n 个指针

  • 只用了 n-1 个指向孩子

  • 剩下n+1 个是空指针,严重浪费

利用空指针存放遍历前驱、后继,就变成线索二叉树

  1. 结点结构
  • data 数据

  • lchild:左孩子 / 前驱线索

  • rchild:右孩子 /后继线索

  • ltag、rtag 标记位

  • tag=0:指针指向孩子

  • tag=1:指针是线索

  1. 三种线索二叉树
  • 先序线索二叉树

  • 中序线索二叉树

  • 后序线索二叉树

4.作用

  1. 利用空闲空指针,不额外开空间

  2. 不用递归、不用栈,就能遍历二叉树

  3. 快速查找结点在遍历序列中的前驱和后继

  4. 特点

  • 中序线索二叉树遍历最简单

  • 先序、后序线索树找前驱后继比较麻烦

  • 线索二叉树本质:静态链表

相关推荐
qq_5024289902 小时前
清华大学与微软亚洲研究院出品:Kronos 本地部署教程
数据结构·python·金融量化·kronos开源模型
C雨后彩虹4 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25014 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
今天又在写代码5 小时前
数据结构v2
数据结构
Rabitebla6 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
深邃-6 小时前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5
就爱学编程6 小时前
惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍
数据结构·算法·排序算法
努力努力再努力wz6 小时前
【MySQL入门系列】掌握表数据的 CRUD:DML 核心语法与执行逻辑解析
android·开发语言·数据结构·数据库·c++·b树·mysql
漂流瓶jz6 小时前
UVA-120 煎饼 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·排序·aoapc·算法竞赛入门经典·uva