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

Posted 结点

篇首语:一身转战三千里,一剑曾百万师。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 树 - 线索二叉树 (三)相关的知识,希望对你有一定的参考价值。

  线索二叉树的运算

   查找某结点*p在指定次序下的前趋和后继结点

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

  在中序线索二叉树中 查找结点*p的中序后继结点分两种情形

  ① 若*p的右子树空(即p >rtag为Thread) 则p >rchild为右线索 直接指向*p的中序后继 【例】下图的中序线索二叉树中

   结点D的中序后继是A

  

>

  ② 若*p的右子树非空(即p >rtag为Link) 则*p的中序后继必是其右子树中第一个中序遍历到的结点 也就是从*p的右孩子

  开始 沿该孩子的左链往下查找 直至找到一个没有左孩子的结点为止 该结点是*p的右子树中 最左下 的结点 即*P的中序后继结

  点

  【例】上图的中序线索二叉树中

  A的中序后继是F 它有右孩子;

  F的中序后继是H 它无右孩子;

  B的中序后继是D 它是B的右孩子

  在中序线索二叉树中求中序后继结点的过程可 具体算法如下

  BinThrNode *InorderSuccessor(BinThrNode *p)

  //在中序线索树中找结点*p的中序后继 设p非空

  BinThrNode *q;

  if (p >rtag==Thread) //*p的右子树为空

  Return p >rchild; //返回右线索所指的中序后继

  else

  q=p >rchild; //从*p的右孩子开始查找

  while (q >ltag==Link)

  q=q >lchild; //左子树非空时 沿左链往下查找

  return q; //当q的左子树为空时 它就是最左下结点

   //end if

  

  该算法的时间复杂度不超过树的高度h 即O(h)

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

  中序是一种对称序 故在中序线索二叉树中查找结点*p的中序前趋结点与找中序后继结点的方法完全对称 具体情形如下

  ① 若*p的左子树为空 则p > child为左线索 直接指向*p的中序前趋结点;

  【例】上图所示的中序线索二叉树中 F结点的中序前趋结点是A

  ② 若*p的左子树非空 则从*p的左孩子出发 沿右指针链往下查找 直到找到一个没有右孩子的结点为止 该结点是*p的左

  子树中 最右下 的结点 它是*p的左子树中最后一个中序遍历到的结点 即*p的中序前趋结点

  【例】上图所示中序线索二叉树中 结点E左子树非空 其中序前趋结点是I

  在中序线索二叉树中求中序前趋结点的过程可 具体算法如下

  BinThrNode *Inorderpre(BinThrNode *p)

  //在中序线索树中找结点*p的中序前趋 设p非空

  BinThrNode *q;

  if (p >ltag==Thread) //*p的左子树为空

  return p >lchild; //返回左线索所指的中序前趋

  else

  q=p >lchild; //从*p的左孩子开始查找

  while (q >rtag==Link)

  q=q >rchild; //右子树非空时 沿右链往下查找

  return q; //当q的右子树为空时 它就是最右下结点

   //end if

  

  由上述讨论可知 对于非线索二叉树 仅从*p出发无法找到其中序前趋(或中序后继) 而必须从根结点开始中序遍历 才能找到

  *p的中序前趋(或中序后继) 线索二叉树中的线索使得查找中序前趋和中序后继变得简单有效

cha138/Article/program/sjjg/201311/23876

相关参考