二叉树的结构定义
public class Node {
int data;
Node left;
Node right;
}
1. 先序遍历
访问根节点,对左子节点做先序遍历,再对右子节点做先序遍历
递归实现
public void preOrder(Node root) {
if (root == null) {
return;
}
System.out.println(root.data);
preOrder(root.left);
preOrder(root.right);
}
非递归实现
public void preOrder(Node root) {
if (root == null) {
return;
}
Deque<Node> stack = new LinkedList<>();
stack.push(root);
while (!stack.isEmpty()) {
Node curr = stack.pop();
System.out.println(curr.data);
if (curr.right != null) {
stack.push(curr.right);
}
if (curr.left != null) {
stack.push(curr.left);
}
}
}
2. 中序遍历
对左子节点做中序遍历,访问当前节点,对右子节点做先序遍历
递归实现
public void inOrder(Node root) {
if (root == null) {
return;
}
inOrder(root.left);
System.out.println(root.data);
inOrder(root.right);
}
非递归实现
public void inOrder(Node root) {
if (root == null) {
return;
}
Deque<Node> stack = new LinkedList<>();
Node curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
System.out.println(curr.data);
curr = curr.right;
}
}
3. 后序遍历
对左子节点做后序遍历,对右子节点做先序遍历,访问当前节点
递归实现
public void postOrder(Node root) {
if (root == null) {
return;
}
postOrder(root.left);
postOrder(root.right);
System.out.println(root.data);
}
非递归实现
public void postOrder(Node root) {
if (root == null) {
return;
}
Deque<Node> stack = new LinkedList<>();
Node curr = root, pre = null;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.peek();
if (curr.right != null && curr.right != pre) {
curr = curr.right;
} else {
stack.pop();
System.out.println(curr.data);
pre = curr;
curr = null;
}
}
}