二叉树非递归先中后序遍历
二叉树
非递归先中后序遍历
思路来源
一周刷爆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); } }