一、二叉树遍历定义
按一定规则依次访问二叉树每个结点且仅访问一次。
二、四种遍历顺序
- 先序遍历(根左右)
根节点 → 左子树 → 右子树
2.中序遍历(左根右)
左子树 → 根节点 → 右子树
二叉搜索树 BST 中序 = 从小到大有序序列
- 后序遍历(左右根)
左子树 → 右子树 → 根节点
- 层序遍历(层次遍历)
从上到下,从左到右,一层一层访问
队列实现
三、递归遍历代码(Java)
-
先序 根左右
void pre(TreeNode root){
if(root==null) return;
访问root;
pre(root.left);
pre(root.right);
} -
中序 左根右
void in(TreeNode root){
if(root==null) return;
in(root.left);
访问root;
in(root.right);
} -
后序 左右根
void post(TreeNode root){
if(root==null) return;
post(root.left);
post(root.right);
访问root;
}
四、遍历要点
-
已知先序 + 中序 → 唯一确定一棵二叉树
-
已知后序 + 中序 → 唯一确定一棵二叉树
-
已知先序 + 后序 → 不能唯一确定
-
递归遍历空间复杂度 = 树的高度(栈深度)
-
时间复杂度一律 O(n),每个结点访问一次
五、线索二叉树
1.普通二叉链表:
-
n 个结点,一共有2n 个指针
-
只用了 n-1 个指向孩子
-
剩下n+1 个是空指针,严重浪费
利用空指针存放遍历前驱、后继,就变成线索二叉树
- 结点结构
-
data 数据
-
lchild:左孩子 / 前驱线索
-
rchild:右孩子 /后继线索
-
ltag、rtag 标记位
-
tag=0:指针指向孩子
-
tag=1:指针是线索
- 三种线索二叉树
-
先序线索二叉树
-
中序线索二叉树
-
后序线索二叉树
4.作用
-
利用空闲空指针,不额外开空间
-
不用递归、不用栈,就能遍历二叉树
-
快速查找结点在遍历序列中的前驱和后继
-
特点
-
中序线索二叉树遍历最简单
-
先序、后序线索树找前驱后继比较麻烦
-
线索二叉树本质:静态链表