线索化二叉树(线索化二叉树遍历方法,倒序线索化二叉树遍历结果)

本篇介绍线索化二叉树、线索化后的中序遍历以及反向输出中序遍历。
注:(不管是前序遍历、中序遍历或者后序遍历,道理都是一样的,只不过顺序不一样,所以本篇的就拿中序遍历作为讲解,方便统一与理解)

1.线索化二叉树

1.1-什么是线索化二叉树

首先思考一下:我们知道,不管是二叉树的前序遍历、中序遍历还是后序遍历最简单的方法就是通过递归进行。由于递归需要系统堆栈,会消耗大量的空间,如果一个二叉树过于“庞大”导致需要递归到很深的时候,系统就可能崩溃。这时我们就会想到,能否根据前序、中序或者后序遍历的过程,用一个数组或者链表来存储二叉树相应的节点呢?显而易见,数组是不可能实现的。由于二叉树的结构就是用地址相互连接起来的,所以只能用链表来实现。那么这个链表还需不需要我们来重新创建?答案是不用的,前人已经为我们设计好了在原二叉树上创建链表的方法。先观察观察这一个二叉树:
在这里插入图片描述
图中节点的个数总共有6个,我们知道每个节点都有两个指针域分别指向左,右子节点。但是我们可以看到,不是每个节点这两个指针域都有使用,恰恰许多浪费了。例如上图,节点4,5,6left,right都是null,节点3right也为null。结论就是:空指针的个数 =节点个数 + 1而我们线索化二叉树的方法就是将这些浪费的指针利用起来。

由于遍历方法有前、中、后续遍历,所以对应的线索化方法也有前序遍历、中序遍历、后续遍历二叉树线索化。本篇只介绍中序遍历线索化二叉树方法,其他道理都是相同的

具体方法就是:将空出来的left用来指向前驱节点,right用来指向后继节点。同时为了区分节点left指向的到底是原二叉树左孩子节点还是遍历结果的前驱节点、right指向的是原二叉树右孩子节点还是遍历结果的后继节点。我们定义leftType,rightType做标记,规则就是当leftType,rightType等于1时代表left,right指向前驱或者后继节点,当leftType,rightType等于0时代表left,right指向左孩子节点或者右孩子节点。(这里必须理解)。以上话总结就是:一个节点的left,right指向的节点有两层含义,一、指向的是左孩子或右孩子节点,二、指向的是前驱或者后继节点,而leftType,rightType这两个标记的作用就是用来区分这两层含义。
所以我们需要将原节点改造为:
在这里插入图片描述
每个节点不再只包含数据域,指针域,还需要包含两个标记元素。
线索化过程:
在这里插入图片描述
解释:以上图片中,红色指针代表指向的是中序遍历结果的前驱或者后继节点及线索化,并且标记元素的值为1。可以看到节点4在遍历结果是第一位,没有前驱节点,所以节点4的left指向null,并且打上标记。节点4的后继节点为节点2,所以节点4空出来的right指向后继节点(节点2),并打上标记。后面的过程以此类推,不再赘述。

经过线索化后的二叉树,此时已经相当于一个双向链表。
在这里插入图片描述

1.2-线索化二叉树的意义

可以看到,经过线索化的二叉树相当于一个双向链表。我们既可以通过这个链表中的某个节点找到前驱和后继节点,也可以很方便的删除或者添加节点。以及进行更加复杂的操作。同时,在我们遍历二叉树的时候,不再使用递归进行,避免了空间资源的浪费。而是通过遍历链表的方式进行。是不是非常的巧妙?

1.3-线索化二叉树完整代码

最后给出完整代码:

 //中序遍历线索化方法
    public void 
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值