线索二叉树
要想让二叉树树像链表那样 通过前驱直接访问后继的方式生成遍历序列,必须将二叉树进行线索化。因此创造出了线索二叉树。
实现方式
如果某个结点的左孩子为空,则将空的孩子指针域改为指向其前驱;
如果某结点的右孩子为空,则将空的右孩子指针域改为指向其后继。
这种改变指向的指针称为线索。
lTag、rTag = 0 指向该结点的左/右孩子
lTag、rTag = 1 指向该结点的前驱/后继
线索二叉树存储结构
typedef struct BiThrNode {
int data; //数据域
struct BiThrNode *lchild;//左子指针
int lTag; //左指针标志域
struct BiThrNode *rchild;//右子指针
int rTag; //右指针标志域
} BiThrNode, *BiThrTree;
先序线索二叉树
先序序列:A B C D E
注意指向前驱和后继而不是孩子和父母!
中序线索二叉树
中序序列:B C A E D
后序线索二叉树
后序序列:C B E D A
增设头结点
为避免悬空,增设一个头结点,使遍历序列中第一个结点的lchild域和最后一个结点的rchild域指向头结点。
中遍历结果:H D I B E A F C G