zoukankan      html  css  js  c++  java
  • 剑指offer——把二叉树打印成多行

    继续练习二叉树,原题目链接:把二叉树打印成多行

    题目描述:

    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

    解题思路:

    从上到下打印,从左到右输出;实质是要考察二叉树的遍历,不同于三种常用的遍历。

    首先从根节点开始遍历;遍历到每个结点,就把该结点的左右结点一起存起来;由于需要返回的是一个列表,所以可以将打印输出改为存放到列表。

    对于结点,可以使用队列进行存储,每遍历到一个结点,就把其左右子结点存入队列末尾;将队首结点的值打印,然后从队列取出该结点。

    具体操作如下:

    对该树的打印过程:

     参考了博文:从上往下打印二叉树(Java)

    实现代码如下:

     注意:

    使用队列的时候,不能直接new Queue;因为Queue是一个抽象类,而LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用

    另外add()和remove()方法在失败的时候会抛出异常;所以一般使用offer()来加入元素,使用poll()来获取并移出元素。

    参考了博文:Queue:poll、offer、element、peek

     1     ArrayList<Integer> Print(TreeNode pRoot){
     2         //新建一个存放树的值的集合
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         if(pRoot == null){  //当树为空时,应该返回空,而不是null
     5             return list;
     6         }
     7 
     8         //建立队列存放树结点
     9         Queue<TreeNode> queue = new LinkedList<TreeNode>();
    10         queue.offer(pRoot);
    11         while(!queue.isEmpty()){
    12             //每次需要将队首的结点值存在list中,然后去除该结点
    13             TreeNode node = queue.poll();
    14             list.add(node.val);
    15             //每次将移除结点的左右节点加入队列
    16              if(node.left != null){
    17                  queue.offer(node.left);
    18              }
    19              if(node.right != null){
    20                  queue.offer(node.right);
    21              }
    22         }
    23         return list;
    24     }

    以上确实能够将二叉树按行进行打印,最终输出一行;但是,题目要求的最终输出并不是一行,而是多行;所以需要确定何时进行分行;按照上面的思路,是每次都把下一层的结点往后面加;若要分行,那便可以在添加下层结点之前先判断一下本层有多少个结点;当本层的结点都出队之后,打印一个换行即可;本题中则是再新建一个集合即可。

    实现代码如下:

     1     ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
     2         //新建一个存放树的值的集合,分行存储
     3         ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
     4         if(pRoot == null){  //当树为空时,应该返回空,而不是null
     5             return list;
     6         }
     7         //建立队列存放树结点
     8         Queue<TreeNode> queue = new LinkedList<TreeNode>();
     9         queue.offer(pRoot);
    10         while(!queue.isEmpty()){
    11             //判断当前层结点的个数
    12             int num = queue.size();
    13             TreeNode node;
    14             // 为每层结点定义一个结合
    15             ArrayList<Integer> arrayList = new ArrayList<Integer>();
    16             while(num > 0){
    17                 //每次需要将队首的结点值存在arrayList集合中,然后去除该结点
    18                 node = queue.poll();
    19                 num--;
    20                 arrayList.add(node.val);
    21                 //每次将移除结点的左右节点加入队列
    22                 if(node.left != null){
    23                     queue.offer(node.left);
    24                 }
    25                 if(node.right != null){
    26                     queue.offer(node.right);
    27                 }
    28             }
    29             //将该层结点值的集合加入list中
    30             list.add(arrayList);
    31         }
    32         return list;
    33     }

    此代码已通过测试。

  • 相关阅读:
    图解 Kubernetes
    如何构建可伸缩的Web应用?
    2020年软件开发趋势
    3种基础的 REST 安全机制
    为什么你应该使用 Kubernetes(k8s)
    Elasticsearch:是什么?你为什么需要他?
    你在使用什么 Redis 客户端工具?
    ZooKeeper 并不适合做注册中心
    Jmeter(三)_配置元件
    Jmeter(二)_基础元件
  • 原文地址:https://www.cnblogs.com/shengguilv/p/13024130.html
Copyright © 2011-2022 走看看