线索二叉树:
二叉树添加了直接指向节点的前驱和后继的指针的二叉树称为线索二叉树。
线索化的实质其实就是将二叉链表中的空指针改为指向其前驱或后继的线索。
也就是在遍历的过程中修改空的指针(非线性结构的线性化操作)。
这是一个线索二叉树,有着指向父节点的特殊指针(图中虚线所示)
详情请自行百科
为什么要进行线索化?
先看看二叉树线索化后的好处吧:
1.之前说过在含有n个节点的二叉链表中有n+1个空链域,勤俭节约的良好传统美德在此处体现。
2.线索化了后遍历起来时间相比之前大大减少。
。。。
遍历之后的结果不就是一个普通的单链表?除第一个和最后一个数据元素之外,其他元素只有一个前驱一个后继。
相关实现:
结构定义:
typedef char Element;
// Link为0,标识左右孩子,Thread为1标识前驱后继的线索
typedef enum {Link,Thread} PointerTag ;
// 线索二叉树节点结构定义
typedef struct CBinTNode{
Element data;
struct CBinTNode *lchild,*rchild;
PointerTag LTag;
PointerTag RTag;
}CBinTNode, *CBinTree;
// 全局变量pre用来记录节点的前驱(上一个访问过的节点)。
CBinTree pre;
二叉树的创建(先序遍历的方式):