https://blog.csdn.net/qiuxinfa123/article/details/84880786
2.先序遍历。非递归先序遍历的思路如下:
1.先将根节点入栈
2.访问根节点
3.如果根节点存在右孩子,则将右孩子入栈
4.如果根节点存在左孩子,则将左孩子入栈(注意:一定是右孩子先入栈,然后左孩子入栈)
5.重复2-4
//先序遍历非递归
public void preOrder2(){
Stack<Node> stack = new Stack();
Node p = root;
stack.push(p);
while (!stack.empty()){
p = stack.pop();
//输出当前节点
System.out.println(p);
//右节点不为空入栈
if (p.right != null){
stack.push(p.right);
}
if (p.left != null){
stack.push(p.left);
}
}
}
3.中序遍历。 非递归中序遍历的思路如下:
1.先将根节点入栈
2.将当前节点的所有左孩子入栈,直到左孩子为空
3.访问栈顶元素,如果栈顶元素存在右孩子,则继续第2步
4.重复第2、3步,直到栈为空并且所有的节点都被访问
//中序遍历非递归
public void infixOrder2(){
Stack<Node> stack = new Stack<>();
Node p = root;
while (p != null || !stack.empty()){
//根节点和当前节点的所有左子节点入栈
while (p != null){
stack.push(p);
p = p.left;
}
//访问栈顶
p = stack.pop();
//输出
System.out.println(p);
if (p.right != null){
p = p.right;
}else {
p = null;
}
}
}
4.后序遍历。 后续遍历的非递归实现思路:
1.根节点入栈
2.将根节点的左子树入栈,直到最左,没有左孩子为止
3.得到栈顶元素的值,先不访问,判断栈顶元素是否存在右孩子,如果存在并且没有被访问,则将右孩子入栈,否则,就访问栈顶元素
//后序遍历非递归
public void postOrder2(){
Stack<Node> stack = new Stack<>();
Node p = root;
Node pre = null;//上一次访问的节点
while (p!=null || !stack.empty()){
//根节点和所以左孩子入栈
while (p != null){
stack.push(p);
p = p.left;
}
//访问栈顶元素但不出栈
p = stack.peek();
if (p.right == null || p.right == pre){
p = stack.pop();
System.out.println(p);
pre = p;
p = null;
}else {
p = p.right;
}
}
}