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

一、二叉树遍历定义

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


二、四种遍历顺序

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

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

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

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

相关推荐
1-1=01 小时前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
希和20271 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH15 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
zh_xuan21 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
白杨尚青1 天前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
likexuec2 天前
数据结构(2)
数据结构
D e re k ZH2 天前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶2 天前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
十二3 天前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯