***二叉树的前序、中序、后序遍历的非递归写法
**非递归方法:栈空间更容易控制
**递归使用栈是系统调用栈,空间比较小,一般也比较固定大小(递归写法更简单)
**自己用非递归,手头实现栈,栈的空间在堆上,一般比较大
(1)前序遍历的非递归
(2)中序遍历的非递归
(3)后序遍历的非递归
public class TreeNode {
int value;
TreeNode left ;
TreeNode right;
}
public class Trees {
//前序遍历的非递归写法
public static void preorderNoR(TreeNode root){
Stack<TreeNode>stack = new Stack<>();
TreeNode cur = root;
while(!stack.empty()||cur!=null){
while(cur!=null){
System.out.println(cur.value);
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.pop();
cur = top.right;
}
}
//中序遍历的非递归
public static void inorderNoR(TreeNode root){
Stack<TreeNode>stack = new Stack<>();
TreeNode cur = root;
while (!stack.empty()||cur!=null){
while(cur!=null){
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.pop();
System.out.println(top.value);
cur = top.right;
}
}
//后序遍历的非递归
private static void postorderNoR(TreeNode root){
Stack<TreeNode>stack =new Stack<>();
TreeNode cur = root;
TreeNode last = null; // 上一个被三次完整经过的结点
while (!stack.empty()||cur!=null){
while(cur!=null){
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.peek();
if(top.right == null||top.right == last){
stack.pop();
System.out.println(top.value);
last = top;
}else{
cur = top.right;
}
}
}
public static void main(String[] args) {
TreeNode n1 = new TreeNode();
n1.value = 1;
n1.left = new TreeNode();
n1.left.value = 2;
n1.right = new TreeNode();
n1.right.value = 3;
n1.left.left = new TreeNode();
n1.left.left.value = 4;
//preorderNoR(n1);
postorderNoR(n1);
//inorderNoR(n1);
}
}