Loading

【解递归】二叉树遍历启发下的解多分枝递归(下)

 1     public void PostOrder(node root){
 2         if(root!=null){
 3             PostOrder(root.left);
 4             PostOrder(root.right);
 5             System.out.print(root.e+" ");
 6         }
 7     }
 8     public void PostOrder_1(node root){
 9         Stack<node> stack=new Stack<>();
10         node p=root;
11         while (p!=null||!stack.empty()){
12             while (p!=null){
13                 if(!p.flag)//向左走一次,不重复
14                     stack.push(p);
15                 p=p.left;
16             }
17             if(p==null&&!stack.empty()){
18                 p=stack.pop();
19                 if(p.flag){//右子树已访问
20                     System.out.print(p.e+" ");
21                     if(!stack.empty()){//根节点的情况
22                         p=stack.pop();
23                         p.flag=true;
24                         stack.push(p);
25                         p=p.right;
26                     }
27                 }else {//压栈,访问右子树
28                     p.flag = true;
29                     stack.push(p);
30                     p=p.right;
31                 }
32             }
33         }
34     }

 

 1    public void  InOrder(node root){
 2         if(root!=null){
 3             InOrder(root.left);
 4             System.out.print(root.e+" ");
 5             InOrder(root.right);
 6         }
 7     }
 8     public void InOrder_1(node root){
 9         Stack<node>stack=new Stack<>();
10         node p=root;
11         while (p!=null||!stack.empty()){
12             while (p!=null){
13                 stack.push(p);
14                 p=p.left;
15             }
16             p=stack.pop();
17             System.out.print(p.e+" ");
18             p=p.right;
19         }
20     }

   先序中序解递归简直是手到擒来,不过后序就稍微绕了个弯子。一个节点要先访问其左子树,这个过程中压栈一次,左子树访问完毕,出栈并改变其标记;将标记过的该节点再次压栈,访问其右子树。而写成代码的时候要根据标记判断这次是左子树走完回来的呢?还是没走左子树的呢?约定标记位使其只遍历一次。

  至于后序解递归例子,归并排序就不错。节点还是保存现场信息,对节点的操作对应后序递归的操作部分,只不过要多一位标记位。

posted @ 2018-11-11 22:39  ArkiWang  阅读(342)  评论(0编辑  收藏  举报