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

Posted le-le

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
            }
        }

以上是关于剑指offer:把二叉树打印成多行的主要内容,如果未能解决你的问题,请参考以下文章

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

《剑指offer》:[60]把二叉树打印成多行

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

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

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

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