剑指 Offer 32 - II. 从上到下打印二叉树 II(102. 二叉树的层序遍历)
题目:
思路:
【1】一种是比较好写的,采用辅助空间,一般采用队列,因为先进先出,方便操作:
1.将节点塞入队列
2.循环判断队列是否为空,不为空则要进行处理
3.此时队列里面的数据量为一组数据
4.将这一组数据的节点都拿出来,将值组合成新数组,且判断左节点是否为空,不为则塞入队列,再判断右节点(基于层次的理念,先左后右)
【2】利用递归的方式,但是这种比较绕。
代码展示:
利用递归的方式:
//时间0 ms击败100% //内存41.4 MB击败74.84% class Solution { public List<List<Integer>> levelOrder(TreeNode root) { ArrayList<List<Integer>> list = new ArrayList<>(); search(root,list,0); return list; } void search(TreeNode node,ArrayList<List<Integer>> list,int depth) { if (node == null) { return; } List<Integer> newList; if (depth >= list.size()) { newList = new ArrayList<>(); list.add(newList); } newList = list.get(depth); newList.add(node.val); search(node.left,list,depth + 1); search(node.right,list,depth + 1); } }
利用队列的方式:
//时间1 ms击败73.7% //内存41.6 MB击败49.87% /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if (root == null) return res; Queue<TreeNode> que = new LinkedList<>(); que.add(root); int count; TreeNode temp; while (!que.isEmpty()){ List<Integer> resList = new ArrayList<>(); count = que.size(); while (count-- > 0){ temp = que.poll(); resList.add(temp.val); if (temp.left != null) que.add(temp.left); if (temp.right != null) que.add(temp.right); } res.add(resList); } return res; } }