【注释详细】《剑指Offer》之Java实现:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

1、题目描述

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

2、算法思想以及知识点补充

算法思想:

     ①  二叉树遍历每一层,把每一层的结点存储到队列中

     ②  然后对每一层的结点进行遍历

     ③  每一层的遍历的结果添加到建好的集合中

     ④  最后将把每层的元素添加到大集合中

     Queue 中 add() 和 offer()都是用来向队列添加一个元素。
     在容量已满的情况下,add() 方法会抛出IllegalStateException异常,offer() 方法只会返回 false 。

     LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

3、算法图解

注意:获取二叉树中的值的方式:

TreeNode node = new TreeNode();
node.val;

4、代码实现

import java.util.*;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
/*
  队列中添加元素可以用add,offer,在栈容量已经满的情况下,add()会抛出IllegalStateException异常
  offer()方法只会返回false
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
      //定义一个集合序列,泛型是ArrayList集合
      //关于泛型是Integer,因为每一层输出的是[[8],[6,10],[5,7,9,11]]
      ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
      // 判断根结点是否为空,为空的话返回list
      if(pRoot == null){
        return list;
      }
      // 定义一个队列存储二叉树中的元素,LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
      Queue<TreeNode> queue = new LinkedList<TreeNode>();
      // 向队列中添加二叉树根节点
      queue.offer(pRoot);
      while(!queue.isEmpty()){
        // 定义一个集合接收每层的二叉树元素
        ArrayList<Integer> arr = new ArrayList<Integer>();
        //获取队列的长度
        int size = queue.size();
        // 对队列进行遍历
        for(int i = 0;i < size;i++){
          // 队列中有元素,出栈队列中的元素
          TreeNode temp = queue.poll();
          // 将出栈的元素放到集合中
          arr.add(temp.val);
          //将左右孩子入队
          if(temp.left != null){
            queue.offer(temp.left);
          }
          if(temp.right != null){
            queue.offer(temp.right);
          }
        }
         list.add(arr);
      }
      return list;
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/115063061
今日推荐