5线线索索树树对二叉树进行某种遍历,可以得到一个线性有序的序列
例如对某二叉树的中序遍历结果:K,D,H,B,G,E,A,X,M,C,F该树转为线性排列,显然其中结点具有唯一前驱和唯一后继
1二叉树ABCEFGHDKXMY想得到一个结点的前驱或后继结点,每次总是从根开始遍历
无论是采用递归方式,还是非递归方式,遍历算法中一定包含着堆栈空间
线索的方法存储结构线索的方法存储结构中序遍历:A的前驱是————,B的前驱是————;E的前驱是————;D的前驱是————;图5
1二叉树ABCEFGHDKXMY一个结点N如果有左子树,则该结点的前驱就是其左子树中最右的子孙P
这个子孙结点的右链接域一定为空
←N是P的最近“左倾”祖先PNEHGK中序遍历:H的前驱是D,G的前驱是B;X的前驱是A图5
1二叉树ABCEFGHDKXMY一个结点N如果没有左子树,则该结点的前驱就是其所有祖先中,最接近它的“右倾”祖先P
这个结点N的左链接域本身就是空
PN←最接近N结点的“右倾”祖先P思考:二叉链表空间效率这么低,能否利用这些空闲区存放有用的信息或线索
——我们可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度
用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针
这就是线索二叉树(ThreadedBinaryTree)线索二叉树的实现线索二叉树的实现规定:1)若结点有左子树,则Lchild指向其左孩子;否则,Lchild指向其直接前驱(即线索);2)若结点有右子树,则Rchild指向其右孩子;否则,Rchild指向其直接后继(即线索)
约定:当flag域为0时,表示正常情况;当flag域为1时,表示线索情况
前驱(后继)左(右)孩子为区别两种不同情况,特增加两个标志域:各1bitL