知识大全 线索二叉树的运算

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的中序前趋(或中序后继) 线索二叉树中的线索使得查找中序前趋和中序后继变得简单有效

( ) 在后序线索二叉树中 查找指定结点*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/22667

相关参考

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

  二叉树的线索化  线索化和线索化实质  将二叉树变为线索二叉树的过程称为线索化  按某种次序将二叉树线索化的实质是按该次序遍历二叉树在遍历过程中用线索取代空指针  具体过程可  二叉树的中序线索化

知识大全 二叉树的遍历

遍历概念  所谓遍历(Traversal)是指沿着某条搜索路线依次对树中每个结点均做一次且仅做一次访问访问结点所做的操作依赖于具体的应用问题  遍历是二叉树上最重要的运算之一是二叉树上进行其它运算之基

知识大全 数据结构之线索二叉树

基本概念  用五个标志域来存储结点的结构   以这种结点结构构成的二叉链表作为二叉树的存储结构叫做线索链表(ThreadedLinkedLists)  线索指向结点前驱和后继的指针  线索二

知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (二)[3]

  .任何二叉树的后序线索树进行后序遍历时都必须用栈【西安交通大学二(分)】  .任何一棵二叉树都可以不用栈实现前序线索树的前序遍历【西安交通大学二(分)】  .由一棵二叉树的前序序列和后序序列可以唯

知识大全 第三部分 树与二叉树[5]

   线索二叉树    //二叉树的二叉线索存储表示  typedefenumPointerTaglinkThread;  typedefStrucBithrNode  

知识大全 树 - 二叉树的遍历 (一)

  遍历概念  所谓遍历(Traversal)是指沿着某条搜索路线依次对树中每个结点均做一次且仅做一次访问访问结点所做的操作依赖于  具体的应用问题  遍历是二叉树上最重要的运算之一是二叉树上进行其它

知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (二)[6]

  在中序线索二叉树中每一非空的线索均指向其祖先结点【合肥工业大学二(分)】  线索二叉树的优点是便于是在中序下查找前驱结点和后继结点【上海海运学院 一(分)】  二叉树中序线索化后不存在空

知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (四)[12]

  .设一棵二叉树的先序中序遍历序列分别为  先序遍历序列ABDFCEGH 中序遍历序列BFDAGEHC  ()画出这棵二叉树  ()画出这棵二叉树的后序线索树  ()将这棵二叉树转换成对应

知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (四)[21]

  .已知一棵二叉树的中序(或中根)遍历结点排列为DGBAECHIF后序(或后根)遍历结点排列为GDBEIHFCA  ()试画出该二叉树  ()试画出该二叉树的中序穿线(或线索)树  ()试画出该二叉

知识大全 数据结构考研分类复习真题 第六章 树和二叉树 (三)[22]

  .下面的算法在中序线索树中找由指针所指结点的后继并由指针指向该后继结点试补充完整(线索树的结点有五个域datalchildrchild左右标志域ltagrtag并规定标志指向孩子指向线索  PRO