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

一、共同点

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

相关推荐
夏日听雨眠4 小时前
数据结构(栈和队列)
数据结构
流年如夢7 小时前
栈和列队(LeetCode)
数据结构·算法·leetcode·链表·职场和发展
qeen8710 小时前
【数据结构】二叉树相关经典函数C语言实现
c语言·数据结构·c++·笔记·学习·算法·二叉树
良木生香11 小时前
【C++初阶】STL——List从入门到应用完全指南(1)
开发语言·数据结构·c++·程序人生·算法·蓝桥杯·学习方法
richard_yuu12 小时前
数据结构|二叉树高阶进阶-经典算法
数据结构·c++·算法
不知名的忻12 小时前
Dijkstra算法(朴素版&堆优化版)
java·数据结构·算法··dijkstra算法
YL2004042614 小时前
027合并两个有序链表
java·数据结构·算法·链表
Zephyr_014 小时前
java数据结构
java·数据结构
xieliyu.15 小时前
Java手搓二叉树:基础遍历与核心操作全解析
java·开发语言·数据结构·学习
期待のcode15 小时前
Redis数据类型
运维·数据结构·redis