• LeetCode OJ


    BFS以及它的扩展,我发现栈是个很好用的数据结构,特别是对于顺序需要颠倒的时候!!!

    这里有个重要的信息:可以用null来标识一个level的结束!!!

    下面是AC代码:

     1 /**
     2      * Given a binary tree, return the bottom-up level order traversal of its nodes' values.
     3      *  (ie, from left to right, level by level from leaf to root).
     4      *  first BSF(but from right to left at each level), then using a stack to traverse from bottom to up
     5      * @param root
     6      * @return
     7      */
     8     public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root){
     9         ArrayList<ArrayList<Integer>> r = new ArrayList<ArrayList<Integer>>();
    10         if(root == null)
    11             return r;
    12         // for BFS
    13         LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
    14         // to record the level information
    15         LinkedList<Integer> level = new LinkedList<Integer>();
    16         //for down to up
    17         LinkedList<Integer> stack = new LinkedList<Integer>();
    18         //to record the level information of the stack
    19         LinkedList<Integer> lel = new LinkedList<Integer>();
    20         
    21         queue.offer(root);
    22         level.offer(1);
    23         while(!queue.isEmpty()){
    24             TreeNode cur = queue.poll();
    25             stack.push(cur.val);// by using stack, we can travesal from the bottom to up
    26             int levelCur = level.poll();
    27             lel.push(levelCur);
    28             if(cur.right!=null)
    29             {
    30                 queue.offer(cur.right);
    31                 level.offer(levelCur+1);
    32             }
    33             if(cur.left!=null){
    34                 queue.offer(cur.left);
    35                 level.offer(levelCur+1);
    36             }
    37         }
    38         ArrayList<Integer> al = null;
    39         int lev = -1;
    40         //from stack to Arraylist
    41         while(!stack.isEmpty()){
    42             int lc = lel.pop();
    43             if(lc!=lev)
    44             {
    45                 if(al!=null)
    46                     r.add(al);
    47                 al = new ArrayList<Integer>();
    48             }
    49             al.add(stack.pop());
    50             lev = lc;
    51         }
    52         r.add(al);
    53         return r;
    54     }
    55 
    56 /**
    57      * Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
    58      * @param root
    59      * @return
    60      */
    61     public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root){
    62         ArrayList<ArrayList<Integer>> r = new ArrayList<ArrayList<Integer>>();
    63         if(root == null)
    64             return r;
    65         //for BFS
    66         LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
    67         ArrayList<Integer> sub = new ArrayList<Integer>();
    68         
    69         queue.offer(root);
    70         queue.offer(null);// the null node is a label for telling a new level is begin
    71         while(!queue.isEmpty()){
    72             TreeNode cur = queue.poll();
    73             //to see if it is the new level begins
    74             if(cur == null){
    75                 //a level has finished, we have to put nodes of the level into the total result
    76                 r.add(sub);
    77                 //begin the next level
    78                 if(queue.isEmpty())
    79                     break;
    80                 else
    81                     cur = queue.pop();
    82                 queue.offer(null);
    83                 //to store the nodes of the new level
    84                 sub = new ArrayList<Integer>();
    85                 sub.add(cur.val);
    86             }else
    87                 sub.add(cur.val);
    88             
    89             if(cur.left!=null)
    90                 queue.offer(cur.left);
    91             if(cur.right!=null)
    92                 queue.offer(cur.right);
    93         }
    94         return r;
    95     }
    有问题可以和我联系,bettyting2010#163 dot com
  • 相关阅读:
    如何计算出OS/400中有多少个Library
    不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
    Shiro + JWT + Spring Boot Restful 简易教程
    面试突击86:SpringBoot 事务不回滚?怎么解决?
    大聪明教你学Java | Spring Boot 使用自定义注解实现防止表单重复提交
    前端取消请求与取消重复请求
    SQL 子查询怎么优化?写的很深的这种!
    springboot 防止重复提交
    SpringBoot 实现 excel 全自由导入导出,性能强的离谱,用起来还特优雅
    「前端每日一问(51)」什么是运行时和编译时?
  • 原文地址:https://www.cnblogs.com/echoht/p/3708016.html
Copyright © 2020-2023  润新知