java非递归实现之二叉树的前中后序遍历详解

 更新时间:2021年09月16日 10:44:45   作者:小玄ks  
树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历),本文将给大家详细的介绍,对大家的学习或工作具有一定的参考借鉴价值

二叉树的前中后序遍历

核心思想:用栈来实现对节点的存储。一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成。

前序遍历

//非递归
//根 左 右
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        //用数组来存储前序遍历结果
        List<Integer> list = new ArrayList<>();
        if(root==null)  return list;
        
        //创建一个栈
        Stack<TreeNode> st = new Stack<>();
        //cur指向根节点
        TreeNode cur = root;
        
        while(!st.isEmpty()||cur!=null){
        
            //一边向左遍历,一边将遍历到的节点入栈,节点值入数组
            while(cur!=null){
                list.add(cur.val);
                st.push(cur);	//根
                cur=cur.left;	//左
            }
            
            //指针指向栈顶节点(即上一个节点),并将栈顶节点出栈
            cur = st.pop();
            //指针指向该节点的右子树,开始下一轮的遍历
            cur = cur.right;	//右
        }
        return list;
    }
}

中序遍历

//非递归
//左 根 右
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
      List<Integer> list = new ArrayList<>();
      if(root==null)    return list;
        
      Stack<TreeNode> st = new Stack<>();
       TreeNode cur = root;
      while(!st.isEmpty()||cur!=null){
      //一边向左遍历,一边将遍历到的节点入栈
          while(cur!=null){
              st.push(cur);
              cur = cur.left;	//左
          }
          cur = st.pop();
          //存储遍历结果
          list.add(cur.val);	//根
          cur = cur.right;		//右
      }
      return list;
    }
}

前序遍历和中序遍历的代码基本相同,但是后序遍历与它们不太一样

后序遍历

//非递归
//左 右 根
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
     List<Integer> list = new ArrayList<>();
     if(root==null) return list;
     TreeNode cur = root;
     
     //关键在于定义一个cur的前驱节点
     TreeNode pre = null;
     Stack<TreeNode> st = new Stack<>();
     while(cur!=null||!st.isEmpty()){
     
     	//一边向左遍历,一边将遍历到的节点入栈
         while(cur!=null){
             st.push(cur);
            cur = cur.left;
         }
         cur = st.pop();
         //若该节点的右节点为空,或者右节点被遍历过,数组才能存储该节点的数值(也就是我们最后才遍历的根)
         if(cur.right==null||cur.right==pre){
             list.add(cur.val);
             pre = cur;
             cur=null;
         }else{//如果不满足,说明该节点的右节点还没有被遍历过,那么接着向右子节点遍历
             st.push(cur);
             cur=cur.right;
         }
     }
     return list;
    }
}

到此这篇关于java非递归实现之二叉树的前中后序遍历详解的文章就介绍到这了,更多相关Java 二叉树遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Guava Cache实现全局缓存的示例代码

    SpringBoot整合Guava Cache实现全局缓存的示例代码

    这篇文章主要介绍了SpringBoot整合Guava Cache实现全局缓存,Guava Cache是Google Guava库中的一个模块,提供了基于内存的本地缓存实现,文中介绍了SpringBoot整合使用Guava Cache的具体步骤,需要的朋友可以参考下
    2024-03-03
  • JAVA获取Image的三种方式

    JAVA获取Image的三种方式

    这篇文章主要介绍了JAVA获取Image的三种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot整合Jasypt实现配置加密的步骤详解

    SpringBoot整合Jasypt实现配置加密的步骤详解

    Jasypt是一个Java库,提供了一种简单的加密解密方式,可用于保护敏感数据,例如密码、API密钥和数据库连接信息等,本文给大家介绍了SpringBoot整合Jasypt实现配置加密的详细步骤,感兴趣的同学可以参考一下
    2023-11-11
  • 在java中http请求带cookie的例子

    在java中http请求带cookie的例子

    今天小编就为大家分享一篇在java中http请求带cookie的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Java8 中使用Stream 让List 转 Map使用问题小结

    Java8 中使用Stream 让List 转 Map使用问题小结

    这篇文章主要介绍了Java8 中使用Stream 让List 转 Map使用总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • Spring data jpa @Query update的坑及解决

    Spring data jpa @Query update的坑及解决

    这篇文章主要介绍了Spring data jpa @Query update的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java 8函数式接口之Consumer用法示例详解

    Java 8函数式接口之Consumer用法示例详解

    这篇文章主要为大家介绍了Java 8函数式接口之Consumer用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 详解Java 中的函数式接口

    详解Java 中的函数式接口

    这篇文章主要为大家介绍了Java中的函数式接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • 浅谈JAVA内存分配与参数传递

    浅谈JAVA内存分配与参数传递

    这篇文章主要介绍了JAVA内存分配与参数传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Springboot使用RestTemplate调用第三方接口的操作代码

    Springboot使用RestTemplate调用第三方接口的操作代码

    这篇文章主要介绍了Springboot使用RestTemplate调用第三方接口,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,感兴趣的朋友可以参考RestTemplate源码
    2022-12-12

最新评论