题目描述

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

代码一

思想,这段代码很厉害,根本想不到,根据前序遍历的特性,然后题目又要求一层层的遍历从左到右,
那么前序遍历一开始也是先遍历树的最左边,也就是每一层的第一个节点.然后神奇的时作者通过遍历深度加深一次那么数组就扩容一次很巧妙.
比如二叉树{1,2,3,4,5,6,7};
那么代码应该是这样的一开始是{1},{2},{4}然后变成{1},{2},{4,5}然后{1},{2,3},{4,5}然后{1},{2,3},{4,5,6,7}就这样OK了

  1. //用递归做的
  2. public class Solution {
  3. ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
  4. ArrayList<ArrayList<Integer>> list = new ArrayList<>();
  5. depth(pRoot, 1, list);
  6. return list;
  7. }
  8. private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
  9. if(root == null) return;
  10. if(depth > list.size())
  11. list.add(new ArrayList<Integer>());
  12. list.get(depth -1).add(root.val);
  13. depth(root.left, depth + 1, list);
  14. depth(root.right, depth + 1, list);
  15. }
  16. }

代码二

思想
通过队列实现层次遍历

  1. ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
  2. Queue<TreeNode> q = new LinkedList<TreeNode>();
  3. ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
  4. if(pRoot==null)return list;
  5. q.add(pRoot);
  6. while(!q.isEmpty()) {
  7. ArrayList<Integer> arr = new ArrayList<Integer>();
  8. int len = q.size();
  9. for(int i=0;i<len;i++) {
  10. TreeNode temp = q.poll();
  11. if(temp==null)continue;
  12. arr.add(temp.val);
  13. q.add(temp.left);
  14. q.add(temp.right);
  15. }
  16. if(!arr.isEmpty()) {
  17. list.add(arr);
  18. }
  19. }
  20. return list;
  21. }