二叉树先序、中序,后序遍历的递归和非递归实现
2018-03-04 22:03
537 查看
import java.util.Stack; public class PreInPosTraversal { public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public static void preOrderRecur(Node head) { if (head == null) { return; } System.out.print(head.value + " "); preOrderRecur(head.left); preOrderRecur(head.right); } public static void inOrderRecur(Node head) { if (head == null) { return; } inOrderRecur(head.left); System.out.print(head.value + " "); inOrderRecur(head.right); } public static void posOrderRecur(Node head) { if (head == null) { return; } posOrderRecur(head.left); posOrderRecur(head.right); System.out.print(head.value + " "); } //非递归前序 public static void preOrderUnRecur(Node head) { System.out.print("pre-order: "); if (head != null) { Stack<Node> stack = new Stack<Node>(); stack.add(head); while (!stack.isEmpty()) { head = stack.pop(); System.out.print(head.value + " "); if (head.right != null) { stack.push(head.right); } if (head.left != null) { stack.push(head.left); } } } System.out.println(); } //非递归中序 /*1.head不为空,一直压左边(往左移动) * 2.head为空,弹出节点,head往右移动 * */ public static void inOrderUnRecur(Node head) { System.out.print("in-order: "); if (head != null) { Stack<Node> stack = new Stack<Node>(); while (!stack.isEmpty() || head != null) { //遇到一个树就把数的左边压入栈 if (head != null) { stack.push(head); head = head.left; //head向左移动 } else { //head == null 往左移动到底了 head = stack.pop(); //空就弹出 System.out.print(head.value + " "); head = head.right; } } } System.out.println(); } //非递归后序 /* * 1.由前序“中左右” -> 中右左 * 2.由另一个栈s2收集“中右左” * 3.弹出s2,变成“左右中” * */ public static void posOrderUnRecur1(Node head) { System.out.print("pos-order: "); if (head != null) { Stack<Node> s1 = new Stack<Node>(); Stack<Node> s2 = new Stack<Node>(); s1.push(head); while (!s1.isEmpty()) { head = s1.pop(); s2.push(head); //与前序区别,此时前序是打印,后续是压入s2。 if (head.left != null) { s1.push(head.left); } if (head.right != null) { s1.push(head.right); } } while (!s2.isEmpty()) { System.out.print(s2.pop().value + " "); } } System.out.println(); } public static void posOrderUnRecur2(Node h) { System.out.print("pos-order: "); if (h != null) { Stack<Node> stack = new Stack<Node>(); stack.push(h); Node c = null; while (!stack.isEmpty()) { c = stack.peek(); if (c.left != null && h != c.left && h != c.right) { stack.push(c.left); } else if (c.right != null && h != c.right) { stack.push(c.right); } else { System.out.print(stack.pop().value + " "); h = c; } } } System.out.println(); } public static void main(String[] args) { Node head = new Node(5); head.left = new Node(3); head.right = new Node(8); head.left.left = new Node(2); head.left.right = new Node(4); head.left.left.left = new Node(1); head.right.left = new Node(7); head.right.left.left = new Node(6); head.right.right = new Node(10); head.right.right.left = new Node(9); head.right.right.right = new Node(11); // recursive System.out.println("==============recursive=============="); System.out.print("pre-order: "); preOrderRecur(head); System.out.println(); System.out.print("in-order: "); inOrderRecur(head); System.out.println(); System.out.print("pos-order: "); posOrderRecur(head); System.out.println(); // unrecursive System.out.println("============unrecursive============="); preOrderUnRecur(head); inOrderUnRecur(head); posOrderUnRecur1(head); posOrderUnRecur2(head); } }
相关文章推荐
- 二叉树的前序、中序、后序遍历非递归实现
- 二叉树先序,中序,后序遍历非递归实现
- 二叉树先序,中序,后序遍历非递归实现
- PHP实现非递归先序、中序、后序遍历二叉树
- C语言非递归实现二叉树的先序、中序、后序、层序遍历
- 二叉树先序,中序,后序遍历非递归实现
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
- Java实现二叉树的递归构建及先序、中序、后序、层序遍历(递归和循环)
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 二叉树先序、中序,后序遍历的非递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 前序、中序、后序遍历二叉树的非递归实现
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归)
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 数据结构-二叉树的前序、中序、后序遍历的递归和非递归实现
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现