tinyxml2遍历所有节点_二叉树问题的基础--二叉树遍历(递归、非递归、mirros遍历)...

二叉树的遍历分前序、中序、后序遍历,实现可以用递归版和非递归版本,正常的遍历都需要使用额外的栈空间来辅助,额外空间复杂度为O(h) h为二叉树高度,mirros遍历则可以充分利用空间,额外空间复杂度为O(1)来实现前序、中序和后序遍历。

递归

三种遍历方式,递归程序都一样,只是打印时机不一样。

345c66ece594721725b4325588466de8.png

非递归

前序遍历:遍历顺序为中左右,这里使用栈结构来辅助,放入头节点,弹出之间打印,再把右节点放到栈里,再放左节点,弹出的顺序则会先弹左,再弹右

3311fba244e9323e564c3b88be9f8c08.png

中序遍历:遍历顺序为左中右,这里使用栈结构来辅助

4cbcc8670cb68f0a951e186eb2d00d70.png

后序遍历:遍历顺序为左右中,这里使用双栈结构来辅助,先实现中右左,然后节点放入到另一个栈中,依次弹出就是左右中了。中右左和前序遍历的代码类似。

095815a856b928695f7963b0a289cd32.png

mirros遍历

mirros遍历主要是利用了叶子节点为null的引用位置,从而避免新使用栈结构。

mirros的流程主要有三种情况:

1、当前节点无左孩子,当前节点向右移动

2、当前节点有左孩子,当前节点左子树上最右的节点的右孩子为空,让其指向当前节点,节点左移

3、当前节点有左孩子,当前节点左子树上最右的节点的右孩子当前节点,让其指向空,节点右移

01e8ac64bf08f1d07b134751b20d1aaa.png

这个就是mirros遍历的流程代码,至于三种遍历方式的实现只是打印时机不一样,这和递归方式类似。

递归每个节点都会访问三次的,前序遍历就是第一次遇到就打印中序遍历就是第二次遇到打印后序遍历是第三次遇到打印

前序遍历:和递归类似,第一次遇到节点就打印。mirros第一次遇到节点分为两种情况:一种是没有左子树;一种是左子树的最右孩子为空

d1859b699badb74ccc1ecfd693d047a7.png

中序遍历:和递归类似,第二次遇到节点就打印。没有左子树话第一次和第二次是同一时刻,有左子树第二次是当左子树都处理完,当前节点右移的时候

cb318343d9342708e1d2adfa260cc1a9.png

后序遍历:mirros有左孩子的节点会经过两次,没有左子树的节点只会经过一次,所有永远不会有第三次经过,这时候我们不用管只经过一次的节点,就是没有左子树的节点。我们只需要在第二次经过节点的时候,逆序打印左子树的右边界。最后打印下整棵树的右边界。

cf36e545484d8005ea3c3f6ac46a18fc.png
a55124173e81fd65475efeb93d3e9f9c.png

希望对大家有所帮助,有帮助记得点赞哦!可以关注下,后面持续分享编程类的文章,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值