线索二叉树
线索二叉树
问题:为什么要研究线索二叉树
当用二叉链表作为二叉树的存储结构时,可以很方便地找到某个结点的左右孩子;但一般情况下,无法直接找到该结点在某种遍历序列中的前驱和后继结点。
线索二叉树
-
定义:利用二叉树的空指针域,如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;如果某结点的右孩子为空则将空的右孩子指针域改为指向其后继。 ———— 这种改变指向的指针称为“线索”。加上线索的二叉树称为线索二叉树(Threaded Binary Tree)。
-
对二叉树按某种遍历次序使其变为线索二叉树的过程叫线索化。
-
为了区分 lchild 和 rchild 指针到底是指向孩子的指针,还是指向前驱或者是后继的指针,对二叉链表中的每个结点增设两个标志域 ltag 和 rtag ,并约定:
ltag = 0 lchild 指向该结点的左孩子
ltag = 1 lchild 指向该结点的前驱
ltag = 0 lchild 指向该结点的右孩子
ltag = 1 lchild 指向该结点的后继
-
线索二叉树结构:
typedef struct BiThrNode{ int data; int ltag,rtag; struct BiThrNode *lchild,*rchild; }BiThrNode,*BiThrTree;
-
增设一个头结点:
头结点的ltag = 0, lchild 指向根结点,rtag = 1,rchild指向遍历序列中的最后结点,遍历序列中第一个结点的lc域和最后一个结点的lc域都指向头结点。