前序中序后序实现二叉树遍历(迭代、非递归)
二叉树先序、中序、后序遍历超级简单的实现(Java)
前序遍历迭代
public void preOrder(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
System.out.println(cur.val); // 前序遍历
cur = cur.left;
} else {
cur = stack.pop();
// System.out.println(cur.val); // 中序遍历
cur = cur.right;
}
}
中序遍历迭代
public void inOrder(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
// System.out.println(cur.val); // 前序遍历
cur = cur.left;
} else {
cur = stack.pop();
System.out.println(cur.val); // 中序遍历
cur = cur.right;
}
}
后序遍历迭代
public void postOrder(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root, pre = null;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.peek();
if (cur.right != null && cur.right != pre) { // 右子树不为空且未被访问,则访问,否则出栈
cur = cur.right; // 先往右入栈再往左
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
System.out.println(cur.val);
pre = cur; // 记录最近被访问的节点
cur = null; // 置为空,好退栈
}
}
}