java 二叉树,非递归遍历

绝大多数可以用递归解决的问题,其实都可以用另一种数据结构来解决,这种数据结构就是栈。
因为递归和栈都有回溯的特性。
如何借助栈来实现二叉树的非递归遍历呢?下面以二叉树的前序遍历为例,看一看具体过程。
1.首先遍历二叉树的根节点1,放入栈中。
2.遍历根节点1的左孩子节点2,放入栈中
3.遍历节点2的左孩子节点4,放入栈中。
4.节点4既没有左孩子,也没有右孩子,我们需要回溯到上一个节点2。可是现在并不是做递归操作,怎么回溯呢?
别担心,栈已经存储了刚才遍历的路径。让旧的栈顶元素4出栈,就可以重新访问节点2,得到节点2的右孩子节点5。
此时节点2已经没有利用价值(已经访问过左孩子和右孩子),节点2出栈,节点5入栈
5.节点5既没有左孩子,也没有右孩子,我们需要再次回溯,一直回溯到节点1。所以让节点5出栈。
根节点1的右孩子是节点3,节点1出栈,节点3入栈。
6.节点3的右孩子是节点6,节点3出栈,节点6入栈
7.节点6既没有左孩子,也没有右孩子,所以节点6出栈。此时栈为空,遍历结束。
       /**
        * 前序遍历,非递归
        * @param node
        */
       public void noFunFrontShow(TreeNode node) {
              // 1. 定义一个栈

 

              Stack<TreeNode> stack = new Stack<>();
              // 如果当前节点不为空,栈不为空
              while (node != null || stack.size() > 0) {
                     // 如果节点不为空
                     while (node != null) {
                            // 输出节点数据
                            System
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值