二叉树先序、中序、后续遍历非递归

 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     }

 

posted @ 2019-09-26 15:56  十指决  阅读(707)  评论(0编辑  收藏  举报