使用非递归方式,对二叉树进行,前序、中序、后序遍历。
import java.util.Stack;
public class BinaryTree {
class TreeNode{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {this.val = val;}
@Override
public String toString() {
return "TreeNode [val=" + val + "]";
}
}
//利用栈实现非递归版本的前序遍历
public void preOrder(TreeNode root) {
if(root == null) {
return;
}
//1、创建一个栈
Stack<TreeNode>stack = new Stack<>();
//2、先把根节点入栈
stack.push(root);
//3、循环取栈顶元素并访问
while(!stack.isEmpty()) {
TreeNode cur = stack.pop();
System.out.println(cur.val);
//4、把当前元素的按右子树然后左子树的顺序入栈
if(cur.right!=null) {
stack.push(cur.right);
}
if(cur.left!=null) {
stack.push(cur.left);
}
}
}
//利用栈实现非递归版本的中序遍历
public void inOrder(TreeNode root) {
if(root == null) {
return;
}
//1、创建啊一个栈
Stack<TreeNode>stack = new Stack<>();
//2、创建一个cur变量从root开始
TreeNode cur = root;
//3、只要cur结点非空就入栈,且cur=cur.left
while(true) {
while(cur!=null) {
stack.push(cur);
cur = cur.left;
}
//4、当cur=null,就出栈一个元素,且访问该元素
if(stack.isEmpty()) {
break;
}
TreeNode top = stack.pop();
System.out.println(top.val);
//5、cur指向当前元素的右子树
cur = top.right;
}
}
//利用栈实现非递归版本的后序遍历
public void postOrder(TreeNode root) {
if(root == null) {
return;
}
//1、创建一个栈
Stack<TreeNode> stack = new Stack<>();
//2、创建cur从root出发
TreeNode cur = root;
//prev永远指向上次访问的结点
TreeNode prev = null;
while(true) {
//3、借助cur循环往左走,如果不为空就 入栈
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
//4、如果为null,取栈顶元素,若top能访问再pop,否则不能出栈
TreeNode top = stack.peek();
//5、是否访问栈顶元素,两种情况:
// a)栈顶元素没有右子树,可以访问
// b)栈顶元素的右子树刚刚访问过,也可以访问
if(top.right == null || prev == top.right) {
//可以访问top结点
System.out.println(top.val);
stack.pop();
//更新prev
prev = top;
} else {
//此时不能访问top结点
//6、cur指向栈顶元素右子树
cur = top.right;
}
}
}
}