知识大全 树 - 线索二叉树 (四)

Posted 结点

篇首语:当筵意气临九霄,星离雨散不终朝。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 树 - 线索二叉树 (四)相关的知识,希望对你有一定的参考价值。

  ( ) 在后序线索二叉树中 查找指定结点*p的后序前趋结点

  在后序线索二叉树中 查找指定结点*p的后序前趋结点的具体规律是

  ① 若*p的左子树为空 则p >lchild是前趋线索 指示其后序前趋结点

  【例】在下图所示的后序线索二叉树中 H的后序前趋是B F的后序前趋是C

  

>

  ② 若*p的左子树非空 则p >lchild不是前趋线索 由于后序遍历时 根是在遍历其左右子树之后被访问的 故*p的后序前趋

  必是两子树中最后一个遍历结点

  当*p的右子树非空时 *p的右孩子必是其后序前趋

  【例】在上图所示的后序线索二叉树中 A的后序前趋是E;

  当*p无右子树时 *p的后序前趋必是其左孩子

  【例】在上图所示的后序线索二叉树中 E的后序前趋是F

  ( ) 在后序线索二叉树中 查找指定结点*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的后序后继 由此 线索对查找指定结点的后序后继并无多大

  帮助

  ( ) 在前序线索二叉树中 查找指定结点*p的前序后继结点

  【参见练习】

  ( ) 在前序线索二叉树中 查找指定结点*p的前序前趋结点

  【参见参考书】

  在前序线索二叉树中 找某一点*p的前序后继也很简单 仅从*p出发就可以找到;但找其前序前趋也必须知道*p的双亲结点

  当树中结点未设双亲指针时 同样要进行从根开始的前序遍历才能找到结点*p的前序前趋

   遍历线索二叉树

  遍历某种次序的线索二叉树 只要从该次序下的开始结点开发 反复找到结点在该次序下的后继 直至终端结点

  遍历中序线索二叉树算法

  void TraverseInorderThrTree(BinThrTree p)

   //遍历中序线索二叉树

  if(p)//树非空

  while(p >ltag==Link)

  p=p >lchild; //从根往下找最左下结点 即中序序列的开始结点

  do

  printf( %c p >data); //访问结点

  p=InorderSuccessor(p); //找*p的中序后继

  while(p)

  //endif

  //TraverselnorderThrTree

  分析

  ① 中序序列的终端结点的右线索为空 所以do语句的终止条件是p==NULL

  ② 该算法的时间复杂性为O(n) 因为是非递归算法 常数因子上小于递归的遍历算法 因此 若对一棵二叉树要经常遍历 或

  查找结点在指定次序下的前趋和后继 则应采用线索链表作为存储结构为宜

  ③ 以上介绍的线索二叉树是一种全线索树(即左右线索均要建立) 许多应用中只要建立左右线索中的一种

  ④ 若在线索链表中增加一个头结点 令头结点的左指针指向根 右指针指向其遍历序列的开始或终端结点会更方便

cha138/Article/program/sjjg/201311/23874

相关参考