我们知道,对称线索二叉树的意义在于,中序遍历这种二叉树时不需要栈结构,也不需要递归实现,而且可以确定某结点在中序序列中的前驱和后继结点。那么现在,如在利用对称序线索二叉树,找到某结点在先根序列中的后继结点呢?
要找到先根序列中的后继结点,可以先直接先根周游已经构造好的对称序二叉树,得到这颗二叉树的先根序列,再搜索后继结点即可。那么,如何先根周游对称序二叉树?
不妨以下面一颗对称序二叉树为例,
除了头结点外,根据对称序线索二叉树的特点,可以把二叉树的各个结点分为三类,左子树不是线索的、左子树是线索而右子树不是线索的、左右子树都是线索的(结点是线索说明该结点不存储信息)。因此,我们可以依照这三种类别对二叉树进行先根遍历:
从二叉树的根结点开始,
1)当左子树不是线索时,顺着左子树一直向下,同时访问遍历到的结点
2)当左子树是线索而右子树不是线索时,访问右子树结点
3)当左、右子树都是线索时,借用线索,跨越父节点,直接访问父节点的右子树,直到右子树为空,先根遍历结束
算法实现如下,
void ThreadPreOrder(pThrTree t) //按先序遍历周游中序线索二叉树
{
pThrTree p =t;