【解递归】二叉树遍历启发下的解多分枝递归(下)
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 }
先序中序解递归简直是手到擒来,不过后序就稍微绕了个弯子。一个节点要先访问其左子树,这个过程中压栈一次,左子树访问完毕,出栈并改变其标记;将标记过的该节点再次压栈,访问其右子树。而写成代码的时候要根据标记判断这次是左子树走完回来的呢?还是没走左子树的呢?约定标记位使其只遍历一次。
至于后序解递归例子,归并排序就不错。节点还是保存现场信息,对节点的操作对应后序递归的操作部分,只不过要多一位标记位。