中序线索二叉树的遍历
中序线索二叉树的结点中隐含了线索二叉树的前驱和后继信息。在对其进行遍历时,只要先找到序列中的第一个结点,然后依次找结点的后继,直至其后继为空。在中序线索二叉树中找结点的后继的规律是:若其右标志为“1”,则右链为线索,指示其后继,否则遍历右子树中第一个访问的结点(右子树中最左下的结点)为其后继。不含头结点的线索二叉树的遍历算法如下。
1.求中序线索二叉树中中序序列下的第一个结点:
ThreadNode *Firstnode(ThreadNode *p){
while(p -> ltag == 0) p = p -> lchild; //最左下结点(不一定是叶子结点)
return p;
}
2.求中序线索二叉树中结点p在中序序列下的后继:
ThreadNode *Nextnode(TreadNode *p){
if(p -> rtag == 0) return Firstnode(p -> rchild);
else return p -> rchild; //ltag == 1 直接返回后继线索
}
3.利用上面俩个算法,可以写出不含头结点的中序线索二叉树的中序遍历的算法:
void Inordor(ThreadNode *T)
for(ThreadNode *p = Firstnode(T); p != NULL; p = Nextnode(p))
visit(p);
}
补充:将程序1中 ltag 和 lchild 换成 rtag 和 rchild,并将 Firstnode 换成 Lastnode,即为求中序线索二叉树的最后一个结点;将程序2中的 rtag 和 rchild 换成 ltag 和 lchild,即为求中序线索二叉树中结点p的前驱。
先序线索二叉树和后序二叉树
先序线索二叉树中找结点的后继:如果有左孩子,则左孩子就是其后继;如果无左孩子但有右孩子,则右孩子就是其后继;如果为叶结点,则右链域直接指示了结点的后继
后序线索二叉树中找结点的后继:1.若结点x是二叉树的根,则其后继为空;2.若结点x是其双亲的右孩子,或是其双亲的左孩子且其双亲没有右孩子,则其后继即为双亲;3.若结点x是其双亲的左孩子,且其双亲有右子树,则其后继为双亲的右子树上按后序遍历列出的第一个结点。