一、线索二叉树的作用
【注意】区分 ‘树的结点的前驱、后继’ 和 ‘基于遍历序列的结点的前驱、后继’
【思考】如何找到一棵普通二叉树的指定结点p在中序遍历中的前驱?
Tip:从根结点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针pre记录上一个被访问的结点
①初始状态下,让pre—>NULL
②当q==p时,pre为前驱
③当pre==p时,q为后继
【缺点】找前驱、后继很不方便;遍历操作必须从根结点开始
于是,有人提出了“线索二叉树”:
【思路】n个结点的二叉树,有n+1个空链域,可以用来记录前驱、后继的信息;用**左孩子指针充当“前驱线索”,用右孩子指针充当“后继线索”**,如果结点没有前驱或者后继(为叶子结点),就将其左/右孩子指针指向NULL
二、线索二叉树的存储结构
//二叉树的结点(链式存储)(术语:二叉链表)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
//二叉链表---->线索链表
//👇👇👇👇👇👇👇👇👇👇👇👇👇👇
//线索二叉树结点(术语:线索链表)
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag; //左、右线索标志,tag=1时表示此指针为线索,tag=0时,指针指向孩子
}ThreadNode,*ThreadTree;
三、三种线索二叉树
1.中序线索二叉树
图片均来自B站王道考研(侵删)
2.先序线索二叉树
3.后序线索二叉树