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

一、共同点

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

相关推荐
im_AMBER2 小时前
Leetcode 159 无重复字符的最长子串 | 长度最小的子数组
javascript·数据结构·学习·算法·leetcode
郝学胜-神的一滴2 小时前
[力扣 105]二叉树前中后序遍历精讲:原理、实现与二叉树还原
数据结构·c++·算法·leetcode·职场和发展
LG.YDX2 小时前
笔试训练48天:mari和shiny(动态规划 - 线性dp)
数据结构·算法
承渊政道2 小时前
【递归、搜索与回溯算法】(floodfill算法:从不会做矩阵题,到真正掌握搜索扩散思想)
数据结构·c++·算法·leetcode·矩阵·dfs·bfs
_小草鱼_2 小时前
【数据结构】链表
数据结构·链表·数组·单链表·双链表
剑挑星河月3 小时前
73.矩阵置零
数据结构·算法·leetcode·矩阵
Rabitebla3 小时前
【C++】手撕日期类——运算符重载完全指南(含易错点+底层逻辑分析)
java·c语言·开发语言·数据结构·c++·算法·链表
自我意识的多元宇宙3 小时前
二叉树的遍历和线索二叉树--中序线索二叉树的构造
数据结构
励志的小陈12 小时前
数据结构--二叉树知识讲解
数据结构