非遞歸方式遍歷二叉樹
阿新 • • 發佈:2017-11-11
方式 pri stat print binary ise pre void reorder
/** * 非遞歸方式的先根序 * @param root */ public static void preOrder(Node root){ Stack<Node> stack = new Stack<Node>(); while (!stack.isEmpty() || root != null) { while (root != null) { System.out.println(root.data); stack.push(root); root = root.left; } if (!stack.isEmpty()) { root = stack.pop(); root = root.right; } } } /** * 非遞歸的方式中根序遍歷二叉樹 * @param node */ public static void orderBinaryTree(Node node) { Stack<Node> stack = new Stack<Node>(); Node point = node; while (!stack.isEmpty() || point != null) { //如果左子樹不為空,則一直入棧 if (point != null) { stack.push(point); point = point.left; } else { point = stack.peek(); visit(point); point = point.right; stack.pop(); } } } /** * 非遞歸方式後根序 * @param node */ public static void lastOrder(Node node) { Stack<Node> stackNode = new Stack<Node>(); Stack<Integer> stackInt = new Stack<Integer>(); int i = 1; while (!stackNode.isEmpty() || node != null) { while(node != null) { stackNode.push(node); stackInt.push(0); node = node.left; } while (!stackNode.isEmpty() && stackInt.peek() == i) { stackInt.pop(); System.out.println(stackNode.pop().data); } if (!stackNode.isEmpty()) { stackInt.pop(); stackInt.push(1); node = stackNode.peek(); node = node.right; } } }
創建一棵二叉樹:
public class Node { Node left = null; Node right = null; Integer data; /** * * @param root */ public Node() { this.left = null; this.right = null; this.data = null; } public Node(Integer data) { this.left = null; this.right= null; this.data = data; } }
非遞歸方式遍歷二叉樹