二叉树中序遍历的三种方法(递归,用栈非递归,不用栈非递归)
/************************************************************************* * Compilation: javac BS.java * Execution: java BS * Author: xjzhou * Date: 2013.07.26 * *************************************************************************/ import java.util.Stack; class Node { private int key; private Node left, right; public Node(int key) { this.key = key; left = null; right = null; } public Node(int key, Node left, Node right) { this.key = key; this.left = left; this.right = right; } public int getKey() {return key;} public Node getLeft() {return left;} public Node getRight() {return right;} public void setKey(int key) {this.key = key;} public void setLeft(Node left) {this.left = left;} public void setRight(Node right) {this.right = right;} } public class BT { private final Node root; public BT() {root = null;} public BT(Node root) {this.root = root;} private void visit(Node x) {System.out.print(x.getKey() + " ");} public void recursiveInOrder() {recursiveInOrder(root);} private void recursiveInOrder(Node x) { if (x == null) return; recursiveInOrder(x.getLeft()); visit(x); recursiveInOrder(x.getRight()); } public void stackInOrder() { if (root == null) return; Stack stack = new Stack<Node>(); Node curr; stack.push(root); while (!stack.empty()) { curr = (Node)stack.pop(); while (curr != null) { if (curr.getRight() != null) stack.push(curr.getRight()); stack.push(curr); curr = curr.getLeft(); } curr = (Node)stack.pop(); while (!stack.empty() && curr.getRight() == null) { visit(curr); curr = (Node)stack.pop(); } visit(curr); } } public void inOrder() {//inOrder traverse without stack and without recursion Node curr = root; while (curr != null) { if (curr.getLeft() == null) { visit(curr); curr = curr.getRight(); } else { Node pre = curr.getLeft(); while (pre.getRight() != null && pre.getRight() != curr) pre = pre.getRight(); if (pre.getRight() == null) { pre.setRight(curr); curr = curr.getLeft(); } else { visit(curr); pre.setRight(null); curr = curr.getRight(); } } } } private static Node initial() { Node a = new Node(1); Node b = new Node(2, null, a); Node c = new Node(3); Node d = new Node(4, b, c); Node e = new Node(5); Node f = new Node(6, e, null); Node g = new Node(7, null, f); Node h = new Node(8, d, g); return h; } public static void main(String[] args) { BT bt = new BT(initial()); bt.recursiveInOrder(); //Output: 2 1 4 3 8 7 6 System.out.println(); bt.stackInOrder();//Output: 2 1 4 3 8 7 6 System.out.println(); bt.inOrder();//Output: 2 1 4 3 8 7 6 } }
posted on 2013-07-26 16:35 ZenLearner 阅读(462) 评论(0) 收藏 举报
浙公网安备 33010602011771号