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

一、共同点

  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),不用栈

相关推荐
charlie1145141912 小时前
deque、list 与 forward_list:vector 之外的三个选择
开发语言·数据结构·c++·list·开源项目
动词ing2 小时前
【学习笔记】数据结构(数组滑动窗口+无重复字符的最长字串题目)
数据结构·笔记·学习
拓人间精准客2 小时前
ToB 销售获客避坑指南:如何用全维度大数据实现降本增效
大数据·数据结构·单例模式
小七在进步3 小时前
数据结构:快速排序
数据结构·算法·排序算法
lzx_0024 小时前
list(全)
数据结构·list
不灭的黄金瞳12319 小时前
C语言手写顺序表
c语言·开发语言·数据结构
qeen8719 小时前
【数据结构】哈希表的C++实现与封装
数据结构·c++·散列表·哈希表
重生之后端学习19 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
fpcc20 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划
星星.7221 天前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法