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;}}}