树--线索二叉树

    上一节,我们学习了树--树的基本概念和二叉树,本节将继续学习树的进阶知识:线索二叉树

    在上一节最后,我们提到。创建树的前提是将树转为扩展二叉树。为此我们增加了很多不必要的#标记以占位。这些标记本质上是无意义的、是一种空间的浪费。且我们的树结构只记录了左右子树的根节点。因此无法知晓前后节点是谁。线索二叉树的本质就是利用扩展标记记录前后节点

    基于某种遍历算法将一颗二叉树转为线索二叉树的过程称之为线索化,线索化后的前驱和后继是按某种遍历算法执行过程中的前后,如前序遍历下的结果为abc,则b的前驱为a后继为c

    按照遍历算法的不同,线索树又分为前序、中序和后续线索化二叉树

    线索二叉树的节点结构如下

    树的数据结构如下

    现假设有二叉树如下

前序线索二叉树

        则前序遍历的结果为:1、2、4、5、3、6、7

      创建的二叉树如下

        JavaScript实现如下

        框黄的位置有点难理解,这里简单记录下:当遍历至节点4时,tree.left为null,标记为1记录前驱节点p,即节点2;p保留节点4,此时以4为根节点的左子树前序遍历完成。执行右子树遍历,右子树为null,结束。此时以4为根节点的右子树遍历完成。退回节点2遍历右子树,即节点5,p.right为null,保留后继节点即节点5

中序线索二叉树

        经过前一节,我们已经知道了中序遍历的核心:左树-根-右树,翻译成代码即

        框红的位置即我们要线索化二叉树的位置

        对于当前二叉树而言,中序遍历结果为:4、2、5、1、6、3、7

        JavaScript实现如下

           分析如下:

                以节点4为例,其左子树不存在,则节点4开启的左递归周期结束,代码

            向下,tree为节点4,故p为节点4。由于节点4的右子树不存在,则节点4的

            完整递归周期结束,回退到节点2的左递归周期的后半部分并将p.right标记

            为节点2

            结果为

后续线索二叉树

    对于当前二叉树而言,后序遍历结果为:4、5、2、6、7、3、1

    JavaScript实现如下

        结果如下

你可能感兴趣的:(树--线索二叉树)