1.线索二叉树的基本概念
传统的链式存储仅能体现一种父子关系,在二叉链表的空链域存放指向其直接前驱和后继的指针,则可以直接得到结点在遍历中的前驱和后继,这种指向前驱和后继结点的指针称为“线索”,加上线索的二叉链表称为线索链表,相应的二叉树被称为线索二叉树。
2.目的
引入线索二叉树是为了加快查找结点前驱和后继的速度
3.线索二叉树的规律
在有N个结点的二叉树中,有N+1个空指针。
(每一个叶子结点有2个空指针,而每一个度为1的结点有1个空指针,总的空指针数为2N0+N1,又有N0=N2+1,所以,总的空指针为N0+N1+N2+1=N+1)
4.二叉树线索化的定义
Lnode | Ltag | Data | Rtag | Rnode |
1. Ltag=0时,表示Lnode指向该结点的左孩子;
2. Ltag=1时,表示Lnode指向该结点的线性前驱结点;
3. Rtag=0时,表示Rnode指向该结点的右孩子;
4. Rnode时,表示Rnode指向该结点的线性后继结点;
线索二叉树的存储结构描述
typedef struct ThreadNode{
ElemType data;
struct ThreadNode lchild,rchild;
int ltag,rtag;
}ThreadNode,ThreadTree;
5.线索二叉树的构造
6.线索二叉树的常见操作及实现思路
1,二叉树线索化
实现思路:按某种次序遍历二叉树,在遍历过程中用线索取代空指针即可。
2,查找后继节点
实现思路:分两种情况,一,没有右孩子,直接获取。二,有右孩子,中序遍历查找右子树中序遍历的第一个节点即为当前节点的后继节点。
3,查找前驱节点
实现思路:同样也分两种情况,一,没有左孩子,依据线索直接获取。二,有左孩子,中序遍历左子树中往右链中第一个没有右孩子的节点即为前驱节点
4,遍历
实现思路:以中序遍历为例,首先找到中序遍历的开始节点,然后利用线索依次查找后继节点即可。