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

一、二叉树遍历定义

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


二、四种遍历顺序

  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. 特点

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

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

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

相关推荐
神明不懂浪漫37 分钟前
【第四章】索引——B+树、回表,加快数据库的查找能力的利器
开发语言·数据结构·数据库·经验分享·笔记·b树
LuminousCPP1 小时前
数据结构 - 排序(二):快速排序从错误初版到优化版|双指针划分 + 三数取中 + 小区间插入优化
c语言·数据结构·笔记·算法·排序算法
hansang_IR2 小时前
【题解】P9753 [CSP-S 2023] 消消乐
数据结构·c++·算法
shehuiyuelaiyuehao2 小时前
算法40,模拟运算,替换所有的问号
数据结构·算法·leetcode
YSL0701242 小时前
OpenCode保姆级安装教程
数据结构
晴天的雨.9923 小时前
[C++算法]快乐数
数据结构·c++·算法
影视飓风TIM3 小时前
C++11 核心新特性完整梳理
数据结构·c++·算法
晴天的雨.9923 小时前
[C++]算法双指针 复写0
数据结构·c++·算法
mmmmath_33 小时前
LeetCode.438.找到字符串中所有字母异位词
数据结构·算法·leetcode
码少女4 小时前
数据结构——堆排序
数据结构