目录
- 1.线索二叉树
- 1.中序线索二叉树
- 2.后序线索二叉树
- 3.先序线索二叉树
- 2.线索二叉树的存储结构
- 3.二叉树的线索化
- 1.中序线索化
- 2.先序线索化
- 3.后序线索化
- 4.寻找前驱/后继
- 1.中序线索二叉树找后继
- 2.中序线索二叉树找中序前驱
- 3.先序线索二叉树找先序后继
- 4.先序线索二叉树找先序前驱
- 5.后序线索二叉树找后序前驱
- 6.后序线索二叉树找后序后继
1.线索二叉树
为了解决普通二叉树遍历,寻找前驱或者后继不方便的问题,引入了线索二叉树。
n个结点的二叉树,有n+1个空链域
,可用来记录前驱、后继的信息。
指向前驱、后继的指针称为‘线索”
1.中序线索二叉树
中序线索二叉树――线索指向中序前驱、中序后继.
左孩子指针指向前驱线索
;
右孩子指针指向后继线索
。
2.后序线索二叉树
后序线索二叉树――线索指向后序前驱、后序后继。
3.先序线索二叉树
先序线索二叉树――线索指向先序前驱、先序后继.
2.线索二叉树的存储结构
tag == 0,表示指针指向
孩子
tag == 1,表示指针是“线索
”
3.二叉树的线索化
1.中序线索化
2.先序线索化
会出现转圈问题。当ltag==0时,才能对左子树先序线索化.
3.后序线索化
4.寻找前驱/后继
1.中序线索二叉树找后继
若右指针没有被线索化,找
右子树中最左下结点
。
2.中序线索二叉树找中序前驱
若左指针没有被线索化,找
左子树中最右下结点
。
3.先序线索二叉树找先序后继
若右指针没有被线索化:
①若结点p有左孩子,则先序后继为左孩子;
②若结点p没有左孩子,则先序后继为右孩子。
4.先序线索二叉树找先序前驱
若左指针没有被线索化,先序遍历中,左右子树中的结点只可能是根的后继,不可能是前驱。
改用
三叉链表
可以找到父节点的情况:
①如果能找到p的父节点,且p是左孩子
,p的父节点即为其前驱。
②如果能找到p 的父节点,且p是右孩子,其左兄弟为空
,p的父节点即为其前驱。
③如果能找到p的父节点,且p是右孩子,其左兄弟非空
,p的前驱为左兄弟子树中最后一个被先序遍历的结点。
④如果p是根节点、则p没有先序前驱
。
5.后序线索二叉树找后序前驱
若左指针没有线索化的情况:
①若p有右孩子,则后序前驱为右孩子。
②若p没有右孩子,则后序前驱为左孩子。
6.后序线索二叉树找后序后继
若右指针没有被线索化:后序遍历中,左右子树中的结点只可能是根的前驱,不可能是后继。
改用
三叉链表
可以找到父结点:
①如果能找到p的父节点,且p是右孩子
,p的父节点即为其后继。
②如果能找到p 的父节点,且p是左孩子,其右兄弟为空
,p的父节点即为其后继。
③如果能找到p的父节点,且p是左孩子,其右兄弟非空
,p的后继为右兄弟子树中第一个被后序遍历的结点。
④如果p是根节点,则p没有后序后继
。