C语言二叉树非递归遍历详解,C语言实现二叉树的递归遍历和非递归遍历

060be319cb84caa398588b94ae359ef4.png

本文实现了二叉树的递归遍历和非递归遍历,当然,还包括一些堆栈操作.

遍历二叉树本质上是一个堆栈和堆栈的问题. 递归算法简单易懂,但效率始终是一个问题. 非递归算法可以清楚地知道实现的每个步骤的细节,但是乍一看并不想很好地理解递归算法,每个都有其自己的好处. 接下来,根据下图讨论树遍历.

a68727064fbcd8b573b77a750eb7ea06.png

bad6103cd494317a3723a40fc78e989c.png

1. 一阶遍历: 一阶遍历是首先输出根节点,然后是左子树,最后是右子树. 上图中的上一个遍历结果为: ABCDEF

c6c2a3faf43a3bdd798b330a483c6783.png

2. 中阶遍历: 中阶遍历是首先输出左子树二叉树的遍历算法c实现,然后是根节点,最后是右子树. 上图中的中间序列遍历结果为: CBDAEF

3. 后序遍历: 后序遍历是先输出左子树,然后输出右子树二叉树的遍历算法c实现,最后是根节点. 上图的后遍历结果为: CDBFEA

img_2_788672286D373542272_26.jpg

其中,用于后序遍历的非递归算法最为复杂. 我使用了一个标识符isOut来指示是否需要弹出打印. 因为仅当打印节点的左右子树时,才能从堆栈中弹出该节点以进行打印,所以当isOut为1且isOut的初始值为0时才打印该节点,主要用于处理非叶节点. 根据后遍历的原则确定,左右子树只能由该节点打印,因此该节点肯定会被访问两次,而不是第一次打印,而第二次打印右子树. 叶子节点打印完成后,将isOut设置为1. (仔细考虑一下,应该有一个逻辑更简单的算法)

isOut的处理如下:

537bb555ade2766ae282c2fc7711b42c.png

以有序遍历为例,查看堆栈内容如何变化:

571b91a1f9e911602b8da1ff5dbf79d0.png

具体代码实现如下: 请参见

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-182602-1.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值