剑指offer:把二叉树打印成多行

题意描述

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

解题思路

一、递归

使用depth表示当前打印的层数。

  1. 当前节点为空,返回。
  2. 当前层数 》 已打印的层数,扩容。
  3. 将元素添加入集合。
  4. 向左递归、向右递归。
     ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
           ArrayList<ArrayList<Integer>> list = new ArrayList<>();
            if(pRoot == null) return list;
            depth(pRoot,1,list);
            return list;
        }
        private void depth(TreeNode root,int depth,ArrayList<ArrayList<Integer>> list){
            if(root == null) return;	//当前节点为空
            if(depth > list.size()){	//先扩容判断
                list.add(new ArrayList<Integer>());
            } 
            list.get(depth-1).add(root.val);	//再添加元素
            depth(root.left,depth+1,list);	//向左递归
            depth(root.right,depth+1,list);	//向右递归

        }

二、非递归

利用队列先进先出的特点。

  1. start表示当前层打印的节点,end表示当前层应该打印的节点。
  2. 将root加入队列,队列不为空,进入循环。弹出队列第一个元素,加入List集合,start+1
  3. root的左节点不为空,加入队列。root的右节点不为空,加入队列。
  4. start = end 时,说明本层已经打印完毕。统计下一层应打印的节点,重置start,List重新赋值。
    public class Solution {
            ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
                ArrayList<ArrayList<Integer>> list = new ArrayList<>();
                if (pRoot == null) return list;
                Queue<TreeNode> queue = new LinkedList<>();
                ArrayList<Integer> arrList = new ArrayList<>();
                int start = 0;	//本层已打印节点
                int end = 1;	//本层应打印节点
                queue.add(pRoot);	//root加入队列
                while (!queue.isEmpty()) {
                    pRoot = queue.remove();
                    arrList.add(pRoot.val);	
                    start++;
                    if (pRoot.left != null) queue.add(pRoot.left);	//左节点不为空
                    if (pRoot.right != null) queue.add(pRoot.right);//右节点不为空
                    if (start == end) {	//本层打印结束
                        end = queue.size();	//计算end
                        start = 0;	//重置start
                        list.add(arrList);	
                        arrList = new ArrayList<Integer>(); //list重新赋值
                    }
                }
                return list;
            }
        }
posted @ 2020-04-27 16:36  灵图  阅读(154)  评论(0编辑  收藏  举报