1 **
2 * 二叉树先序遍历非递归
3 * @param root
4 */
5 public void preOrder_no_recursive(TreeNode root){
6 if(root == null) return;
7
8 Stack<TreeNode> stack = new Stack<>();
9 stack.add(root);
10 while(!stack.isEmpty()){
11 TreeNode tn = stack.pop();
12 System.out.println(tn.val); // 输出
13 if(tn.right != null) stack.add(tn.right);
14 if(tn.left != null)stack.add(tn.left);
15 }
16 }
17
18 /**
19 * 二叉树中序遍历非递归
20 * @param root
21 */
22 public void inOrder_no_recursive(TreeNode root){
23 if(root==null)return;
24 Stack<TreeNode> stk = new Stack<TreeNode>();
25 TreeNode p = root;//辅助节点
26 stk.add(p);
27 while(stk.isEmpty() == false) {
28 //只要你有左孩子,就将左孩子压入栈中
29 if(p!=null && p.left!=null) {
30 stk.add(p.left);
31 p = p.left;
32 }else {
33 p = stk.pop();//弹出栈顶节点 左孩子--->根节点
34 System.out.print(p.val+" ");//访问
35 if(p!=null && p.right!=null) {//如果栈点元素有右孩子的话,将有节点压入栈中
36 stk.add(p.right);
37 p = p.right;
38 }else
39 p = null;//p=stk.pop;已经访问过p了,p设置为null
40 }
41 }
42 }
43
44 /**
45 * 二叉树后序遍历非递归
46 * @param root
47 */
48 public void postOrder_no_recursive(TreeNode root){
49 if(root == null)return;
50 TreeNode p = root;
51 TreeNode pVisit = null;
52 Stack<TreeNode> stk = new Stack<TreeNode>();
53 stk.add(p);
54
55 while(stk.isEmpty() == false) {
56 //只要你有左孩子,就将左孩子压入栈中
57 if(p!=null && p.left!=null) {
58 stk.add(p.left);
59 p = p.left;
60 }else {
61 p = stk.peek();//栈顶元素,先出栈,可能还有右孩子
62 if(p.right==null || p.right==pVisit) {//如果没有右孩子或右孩子已经访问过了,出栈
63 System.out.print(p.val+" ");
64 pVisit = p;//这个很重要,考虑一下只有右孩子的树,得不断的回溯
65 p = null;//没有新节点加入,继续进行出栈操作
66 stk.pop();
67 }else {//如果有右孩子,右孩子入栈
68 pVisit = p.right;
69 stk.add(p.right);
70 p = p.right;
71 }
72 }
73 }
74 }
知识兔