《算法通关村-迭代实现二叉树的后序遍历》

        二叉树的层序遍历也就是广度优先遍历(BFS)说明在前面的文章已经写过了,下面说一下深度优先遍历(DFS),那深度优先遍历一般有三种:前序中序后序遍历。那么最难的也是后序遍历,接下来说一下后序遍历的两种方法:

        一、递归,递归是比较简单且容易理解和实现的,就是不断的开栈调用自己访问左子节点和右子节点,如果没有就返回,具体代码如下:      

        二、 迭代遍历实现

        下面介绍两种吧,反转法和访问标记法。

        反转法,以上面这个测试用例举例子,后序遍历输出的是[6,7,2,4,5,3,1],先序输出的是[1,2,6,7,3,4,5], 后序反转后是[1,3,5,4,2,7,6],那么会发现,先序遍历是中左右,如果按中右左去访问上面的树就是[1,3,5,4,2,7,6],也就是后序的反转。那么只需要改一下先序遍历的迭代法就能实现,具体代码如下:    

        标记法,标记法也是利用了栈的先进后出的特性,那这里就要用每次指向最顶的节点去遍历了,先将root入栈,循环去访问子节点,如果都为空了那代表已经访问到最深处的子节点了,那就出栈记录数据,这里要说一点的是由于栈后出的特性,后序遍历左中右的访问,就要先变成右中左反过来入栈,才会先输出左边,具体代码如下:               还有一种morris方法,学习了但没想明白,后续再更新,有兴趣的同学也可以自己去研究一下,这里给自己总结了,在广度优先遍历的情况下,利用了队列的特性,深度优先遍历则是利用了栈的特性进行辅助,不得不说这个Deque双端队列这种数据结构是真的好用,add就是队列,push就入栈了。那么最后要提一下这个反转法,感觉这种方法不是严格意义上的节点方法,因为它不是按照所需要的访问顺序去访问的只是把最后的值写对了而已,有点类似去访问别人家,我下午才去的B,上午去的A,却把时间最后调转改写了,那么按时间来说这肯定是错的。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值