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

一、二叉树遍历定义

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


二、四种遍历顺序

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

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

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

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

相关推荐
晚风叙码30 分钟前
C++哈希表实现:开放定址法和链地址法 (哈希桶)
数据结构·c++·哈希算法·散列表
imaol131 分钟前
哈希表--数据结构
数据结构·散列表
Herbert_hwt15 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
晚风醉蝶16 小时前
1-6-插入排序-InsertionSort
java·数据结构·排序算法
Tyler_TXZ16 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
有点。17 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
LuminousCPP17 小时前
栈和队列专题(一):LeetCode 20. 有效的括号
数据结构·经验分享·笔记·leetcode·手写栈
白狐_79819 小时前
408 数据结构|线索二叉树两题详解:先序线索化后的空链域 + 中序前驱/后继判断
c语言·数据结构·链表
疯狂打码的少年20 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
wabs66620 小时前
关于字符串【力扣541.反转字符串II的思考】
数据结构·算法·leetcode·字符串