二叉树非递归先中后序遍历
二叉树
非递归先中后序遍历
思路来源
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到
笔记内容
-
问题描述
给定一个二叉树头结点,使用非递归的方式进行分别先中后序遍历。
-
算法思路
使用栈结构实现非递归遍历
- 先序遍历:创建一个栈,每次弹出一个结点并打印。若该结点含有孩子,按先右后左的顺序压入栈,若没有则直接弹出。
- 中序遍历:创建两个栈stack和result。首先在stack中压入从头结点开始的左边界,并依次取出一个结点,压入result栈中。若该结点含有孩子,则stack压入子结点的左边界。直到stack为空,打印result中所有结点。
- 后序遍历:与先序遍历类似,但同样需要创建result栈,stack栈弹出的结点不直接打印,而是压入result栈中。直到stack为空,打印result中所有结点。
-
代码实现
/** class MyNode { public int num; public MyNode left; public MyNode right; public MyNode(int num, MyNode left, MyNode right) { this.num = num; this.left = left; this.right = right; } } */ //先序遍历 public static void Non_recursive_precedence(MyNode head){ Stack stack = new Stack(); stack.add(head); while (!stack.empty()){ MyNode node = (MyNode) stack.pop(); System.out.println(node.num); if(node.right != null){ stack.add(node.right); } if(node.left != null){ stack.add(node.left); } } } //中序遍历 public static void Non_recursive_middle_order(MyNode head){ Stack stack = new Stack(); Stack result = new Stack(); while (head != null){ stack.add(head); head = head.left; } while (!stack.isEmpty()){ MyNode node = (MyNode) stack.peek(); MyNode node1 = (MyNode) stack.pop(); result.add(node1); if(node.right != null){ node = node.right; while (head != null){ stack.add(head); head = head.left; } } } } //后续遍历 public static void Non_recursive_postorder(MyNode head){ Stack stack = new Stack(); Stack result = new Stack(); stack.add(head); while (!stack.isEmpty()){ MyNode node = (MyNode) stack.pop(); result.add(node); if(node.left != null){ stack.add(node.left); } if(node.right != null){ stack.add(node.right); } } while (!result.isEmpty()){ MyNode node = (MyNode)result.pop(); System.out.println(node.num); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」