二叉树的遍历和线索二叉树--先序二叉树和后续二叉树

一、共同点

  1. 都是利用二叉链表n+1个空指针改线索

  2. ltag、rtag 标记规则一样

  • `ltag=0`左孩子,`ltag=1`前驱线索

  • `rtag=0`右孩子,`rtag=1`后继线索

  1. 都可以不用栈、不用递归遍历

  2. 构造方式:按对应遍历顺序遍历树,用`pre`记录前驱


1、先序线索二叉树(先根遍历:根 → 左 → 右)

  1. 构造规则

按照先序:根→左→右遍历

  1. 先访问根

  2. 线索化左子树

  3. 线索化右子树

  4. 空左指针 → 前驱

  5. 空右指针 → 后继

  6. 先序线索树 遍历规律

  • 首结点:根结点本身(不用往左找)

  • 找后继:

  1. `rtag=1` → 直接右指针就是后继

  2. `rtag=0` → 先找左孩子,没有再找右孩子

  3. 致命缺点

先序线索二叉树,无法找父结点,容易死循环

左子树线索会指回祖先,遍历容易重复遍历

  1. 先序线索化代码逻辑

    pre = null;
    void preThread(TNode root){
    if(root==null) return;

    复制代码
     //处理根
     if(root.left==null){
         root.left=pre; root.ltag=1;
     }
     if(pre!=null&&pre.right==null){
         pre.right=root; pre.rtag=1;
     }
     pre=root;
    
     //先序:根→左→右
     if(root.ltag==0) preThread(root.left);
     if(root.rtag==0) preThread(root.right);

    }

2、后序线索二叉树(后根遍历:左 → 右 → 根)

  1. 构造规则

按照后序:左→右→根遍历整棵树

  1. 先线索化左子树

  2. 再线索化右子树

  3. 最后处理当前根结点

  4. 空指针改前驱、后继线索

  5. 后序线索树 遍历规律

  • 首结点:最左下最深结点

  • 找前驱、后继非常麻烦

  • 必须知道双亲结点才能顺利找后继

  1. 最大难点

后序线索二叉树,查找前驱后继极复杂

单纯靠线索走不完整,必须额外记录父结点

  1. 后序线索化代码逻辑

    pre = null;
    void postThread(TNode root){
    if(root==null) return;

    复制代码
     //后序:左→右→根
     postThread(root.left);
     postThread(root.right);
    
     //处理当前结点
     if(root.left==null){
         root.left=pre; root.ltag=1;
     }
     if(pre!=null&&pre.right==null){
         pre.right=root; pre.rtag=1;
     }
     pre=root;

    }

三种线索二叉树对比

1.中序线索二叉树

  • 遍历最简单

  • 找前驱后继最简单

  • 不会死循环

  1. 先序线索二叉树
  • 构造简单

  • 找后继简单,找前驱极难

  • 易死循环

  1. 后序线索二叉树
  • 构造麻烦

  • 找前驱后继都很难

  • 必须双亲指针辅助


总结

  1. 只有中序线索二叉树遍历最方便、最常用

  2. 先序:根最先访问,首结点是根

  3. 后序:根最后访问,首尾都要深入子树找

  4. 先序、后序线索树不适合快速查找前后结点

  5. 三种线索树空间复杂度都是 O(1),不用栈

相关推荐
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾5 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8215 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q5 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒5 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记5 天前
单项不带头不循环链表
数据结构·链表
小糯米6015 天前
JS 数组
数据结构·算法·排序算法
小欣加油5 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒5 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode