/** 二叉树遍历 */ |
public class BinTree { |
protected BTNode root; |
|
public BinTree(BTNode root) { |
this.root = root; |
} |
|
public BTNode getRoot() { |
return root; |
} |
|
/** 构造树 */ |
public static BTNode init() { |
BTNode a = new BTNode('A'); |
BTNode b = new BTNode('B', null, a); |
BTNode c = new BTNode('C'); |
BTNode d = new BTNode('D', b, c); |
BTNode e = new BTNode('E'); |
BTNode f = new BTNode('F', e, null); |
BTNode g = new BTNode('G', null, f); |
BTNode h = new BTNode('H', d, g); |
return h;// root |
} |
|
/** 访问节点 */ |
public static void visit(BTNode p) { |
System.out.print(p.getKey() + " "); |
} |
|
/** 递归实现前序遍历 */ |
protected static void preorder(BTNode p) { |
if (p != null) { |
visit(p); |
preorder(p.getLeft()); |
preorder(p.getRight()); |
} |
} |
|
/** 递归实现中序遍历 */ |
protected static void inorder(BTNode p) { |
if (p != null) { |
inorder(p.getLeft()); |
visit(p); |
inorder(p.getRight()); |
} |
} |
|
/** 递归实现后序遍历 */ |
protected static void postorder(BTNode p) { |
if (p != null) { |
postorder(p.getLeft()); |
postorder(p.getRight()); |
visit(p); |
} |
} |
|
/** 非递归实现前序遍历 */ |
protected static void iterativePreorder(BTNode p) { |
Stack<BTNode> stack = new Stack<BTNode>(); |
if (p != null) { |
stack.push(p); |
while (!stack.empty()) { |
p = stack.pop(); |
visit(p); |
if (p.getRight() != null) |
stack.push(p.getRight()); |
if (p.getLeft() != null) |
stack.push(p.getLeft()); |
} |
} |
} |
|
/** 非递归实现后序遍历 */ |
protected static void iterativePostorder(BTNode p) { |
BTNode q = p; |
Stack<BTNode> stack = new Stack<BTNode>(); |
while (p != null) { |
// 左子树入栈 |
for (; p.getLeft() != null; p = p.getLeft()) |
stack.push(p); |
// 当前节点无右子或右子已经输出 |
while (p != null && (p.getRight() == null | | p.getRight() == q)) { |
visit(p); |
q = p;// 记录上一个已输出节点 |
if (stack.empty()) |
return; |
p = stack.pop(); |
} |
// 处理右子 |
stack.push(p); |
p = p.getRight(); |
} |
} |
|
/** 非递归实现中序遍历 */ |
protected static void iterativeInorder(BTNode p) { |
Stack<BTNode> stack = new Stack<BTNode>(); |
while (p != null) { |
while (p != null) { |
if (p.getRight() != null) |
stack.push(p.getRight());// 当前节点右子入栈 |
stack.push(p);// 当前节点入栈 |
p = p.getLeft(); |
} |
p = stack.pop(); |
while (!stack.empty() && p.getRight() == null) { |
visit(p); |
p = stack.pop(); |
} |
visit(p); |
if (!stack.empty()) |
p = stack.pop(); |
else |
p = null; |
} |
} |
|
public static void main(String[] args) { |
BinTree tree = new BinTree(init()); |
System.out.print(" Pre-Order:"); |
preorder(tree.getRoot()); |
System.out.println(); |
System.out.print(" In-Order:"); |
inorder(tree.getRoot()); |
System.out.println(); |
System.out.print("ost-Order:"); |
postorder(tree.getRoot()); |
System.out.println(); |
System.out.print(" Pre-Order:"); |
iterativePreorder(tree.getRoot()); |
System.out.println(); |
System.out.print(" In-Order:"); |
iterativeInorder(tree.getRoot()); |
System.out.println(); |
System.out.print("Post-Order:"); |
iterativePostorder(tree.getRoot()); |
System.out.println(); |
} |
} |