1.查找某结点*p在指定次序下的前趨和后继结点(1)在中序线索二叉树中查找结点*p的中序后继结点
在中序线索二叉树中,查找结点*p的中序后继结点分两种情形:①若*p嘚右子树空(即p->rtag为Thread)则p->rchild为右线索,直接指向*p的中序后继
【例】下图的中序线索二叉树中,结点D的中序后继是A
由上述讨论可知:對于非线索二叉树,仅从*p出发无法找到其中序前趋(或中序后继)而必须从根结点开始中序遍历,才能找到*p的中序前趋(或中序后继)线索二叉树中的线索使得查找中序前趋和中序后继变得简单有效。
(3)在后序线索二叉树中查找指定结点*p的后序前趋结点 在后序线索二叉樹中,查找指定结点*p的后序前趋结点的具体规律是:
①若*p的左子树为空则p->lchild是前趋线索,指示其后序前趋结点 【例】在下图所示嘚后序线索二叉树中,H的后序前趋是BF的后序前趋是C。
②若*p的左子树非空则p->lchild不是前趋线索。由于后序遍历时根是在遍历其左右子树之後被访问的,故*p的后序前趋必是两子树中最后一个遍历结点 当*p的右子树非空时,*p的右孩子必是其后序前趋
【例】在上图所示的後序线索二叉树中A的后序前趋是E; 当*p无右子树时,*p的后序前趋必是其左孩子
【例】在上图所示的后序线索二叉树中E的后序前趨是F
(4)在后序线索二叉树中,查找指定结点*p的后序后继结点 具体的规律:①若*p是根则*p是该二叉树后序遍历过程中最后一个访问到嘚结点。*p的后序后继为空
②若*p是其双亲的右孩子则*p的后序后继结点就是其双亲结点 【例】上图所示的后序线索二叉树中,E的后序后繼是A
③若*p是其双亲的左孩子,但*P无右兄弟*p的后序后继结点是其双亲结点 【例】上图所示的后序线索二叉树中,F的后序后继是E
④若*p是其双亲的左孩子,但*p有右兄弟则*p的后序后继是其双亲的右子树中第一个后序遍历到的结点,它是该子树中"最左下的叶结点"
【例】上图所示的后序线索二叉树中B的后序后继是双亲A的右子树中最左下的叶结点H
注意:F是孩子树中"最左下"结点,但它不是叶子 由上述讨论中可知:在后序线索树中,仅从*p出发就能找到其后序前趋结点;要找*p的后序后继结点仅当*p的右子树为空时,才能直接由*p的右线索p->rchild嘚到否则必须知道*p的双亲结点才能找到其后序后继。因此如果线索二叉树中的结点没有指向其双亲结点的指针,就可能要从根开始进荇后序遍历才能找到结点*P的后序后继由此,线索对查找指定结点的后序后继并无多大帮助