线索二叉树(存储结构,线索化,寻找前驱/后继)

目录

  • 1.线索二叉树
    • 1.中序线索二叉树
    • 2.后序线索二叉树
    • 3.先序线索二叉树
  • 2.线索二叉树的存储结构
  • 3.二叉树的线索化
    • 1.中序线索化
    • 2.先序线索化
    • 3.后序线索化
  • 4.寻找前驱/后继
    • 1.中序线索二叉树找后继
    • 2.中序线索二叉树找中序前驱
    • 3.先序线索二叉树找先序后继
    • 4.先序线索二叉树找先序前驱
    • 5.后序线索二叉树找后序前驱
    • 6.后序线索二叉树找后序后继

1.线索二叉树

为了解决普通二叉树遍历,寻找前驱或者后继不方便的问题,引入了线索二叉树。
n个结点的二叉树,有n+1个空链域,可用来记录前驱、后继的信息。
指向前驱、后继的指针称为‘线索”

1.中序线索二叉树

中序线索二叉树――线索指向中序前驱、中序后继.
左孩子指针指向前驱线索
右孩子指针指向后继线索

线索二叉树(存储结构,线索化,寻找前驱/后继)_第1张图片

2.后序线索二叉树

后序线索二叉树――线索指向后序前驱、后序后继。

线索二叉树(存储结构,线索化,寻找前驱/后继)_第2张图片

3.先序线索二叉树

先序线索二叉树――线索指向先序前驱、先序后继.

线索二叉树(存储结构,线索化,寻找前驱/后继)_第3张图片

2.线索二叉树的存储结构

线索二叉树(存储结构,线索化,寻找前驱/后继)_第4张图片

tag == 0,表示指针指向孩子
tag == 1,表示指针是“线索

3.二叉树的线索化

1.中序线索化

线索二叉树(存储结构,线索化,寻找前驱/后继)_第5张图片

2.先序线索化

会出现转圈问题。当ltag==0时,才能对左子树先序线索化.

线索二叉树(存储结构,线索化,寻找前驱/后继)_第6张图片

3.后序线索化

线索二叉树(存储结构,线索化,寻找前驱/后继)_第7张图片

4.寻找前驱/后继

1.中序线索二叉树找后继

若右指针没有被线索化,找右子树中最左下结点

线索二叉树(存储结构,线索化,寻找前驱/后继)_第8张图片

2.中序线索二叉树找中序前驱

若左指针没有被线索化,找左子树中最右下结点

线索二叉树(存储结构,线索化,寻找前驱/后继)_第9张图片

3.先序线索二叉树找先序后继

若右指针没有被线索化:
①若结点p有左孩子,则先序后继为左孩子;
②若结点p没有左孩子,则先序后继为右孩子。

线索二叉树(存储结构,线索化,寻找前驱/后继)_第10张图片

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没有后序后继

你可能感兴趣的:(数据结构与算法,链表,数据结构,算法)