二叉树遍历包括先序遍历、中序遍历、后序遍历、层次遍历,每次遍历的实现分为递归和非递归形式。
class Node {
char val;
Node left;
Node right;
public Node(char val, Node left, Node right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class BiTree {
public static void main(String[] args) {
Node d = new Node('D', null, null);
Node e = new Node('E', null, null);
Node f = new Node('F', null, null);
Node b = new Node('B', d, e);
Node c = new Node('C', null, f);
Node a = new Node('A', b, c);
// 先序遍历
//preOrder(a);//递归
// System.out.println();
// preOrder_(a);//非递归
// 中序遍历
// inOrder(a);//递归
// System.out.println();
// inOrder_(a);//非递归
// 后序遍历
// postOrder(a);//递归
// System.out.println();
// postOrder_(a);//非递归
// 层次遍历
level_print(a);
}
private static void postOrder(Node root) {
if (root == null)
return;
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val + " ");
}
private static void inOrder(Node root) {
if (root == null)
return;
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
private static void preOrder(Node root) {
if (root == null)
return;
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
// 先序遍历非递归
// 根左右
private static void preOrder_(Node root) {
java.util.Stack<Node> stack = new java.util.Stack<>();
if (root != null)
stack.push(root);
while (!stack.empty()) {
Node top = stack.pop();
System.out.print(top.val + " ");
if (top.right != null)
stack.push(top.right);
if (top.left != null)
stack.push(top.left);
}
}
// 中序遍历非递归
// 左根右
public static void inOrder_(Node root) {
java.util.Stack<Node> stack = new java.util.Stack();
Node p = root;
while (!stack.empty() || p != null) {
if (p != null) {
stack.push(p);
p = p.left;
} else {
p = stack.pop();
System.out.print(p.val + " ");
p = p.right;
}
}
}
// 后序遍历非递归
// 左右根
private static void postOrder_(Node root) {
Node p = root;
Node q;
java.util.Stack<Node> stack = new java.util.Stack<>();
do {
while (p != null) {
stack.push(p);
p = p.left;
}
q = null;
while (!stack.empty()) {
p = stack.pop();
if (p.right == q) {
System.out.print(p.val + " ");
q = p;
} else {
stack.push(p);
p = p.right;
break;
}
}
} while (!stack.empty());
}
// 层次遍历
private static void level_print(Node root) {
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node top = queue.poll();
System.out.print(top.val + " ");
if (top.left != null)
queue.offer(top.left);
if (top.right != null)
queue.offer(top.right);
}
}
}