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 二叉树遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Jpa中Specification的求和sum不生效原理分析
这篇文章主要为大家介绍了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08springboot 集成redission 以及分布式锁的使用详解
这篇文章主要介绍了springboot 集成redission 以及分布式锁的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10Spring Data Elasticsearch 5.0.x修改数据后无法立即刷新解决方法示例
这篇文章主要为大家介绍了Spring Data Elasticsearch 5.0.x修改数据后无法立即刷新解决方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08详解SpringMVC和MyBatis框架开发环境搭建和简单实用
这篇文章主要介绍了详解SpringMVC和MyBatis框架开发环境搭建和简单实用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-05-05
最新评论