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

一、二叉树遍历定义

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


二、四种遍历顺序

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

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

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

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

相关推荐
凉茶钱32 分钟前
list:哨兵节点,const_iterator 和 const iterator的区别与迭代器失效
数据结构·c++·list
敲代码的苦132 小时前
头歌数据结构-排序的实现及其应用
数据结构
有同事要进步3 小时前
Leecode第68题:x的平方根
java·数据结构·算法
Pniubi3 小时前
HashMap扩容全流程
java·开发语言·数据结构
by209991 天前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
Code_Solitude1 天前
c语言:关于qsoet函数知识点
c语言·数据结构·算法
Pniubi1 天前
快速排序(力扣基础)(递归)
java·数据结构·算法
inrichtt1 天前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger1 天前
数据结构——选择排序
数据结构·算法·排序算法
丑梨数据2 天前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法