zoukankan      html  css  js  c++  java
  • 【解递归】二叉树遍历启发下的解多分枝递归(下)

     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     }

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

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

  • 相关阅读:
    window/mac系统关机
    C++生成dump文件
    Qt词典搜索
    Qt将窗体变为顶层窗体
    MySql 分页
    JS之字符串与JSON转换
    简单的Map缓存机制实现
    WebSocket之获取HttpSession
    JSON格式之GSON解析
    Spring框架学习之IOC(二)
  • 原文地址:https://www.cnblogs.com/yuelien/p/9944017.html
Copyright © 2011-2022 走看看