剑指offer:把二叉树打印成多行
Posted le-le
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:把二叉树打印成多行相关的知识,希望对你有一定的参考价值。
题意描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
解题思路
一、递归
使用depth表示当前打印的层数。
- 当前节点为空,返回。
- 当前层数 》 已打印的层数,扩容。
- 将元素添加入集合。
- 向左递归、向右递归。
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); //向右递归
}
二、非递归
利用队列先进先出的特点。
- start表示当前层打印的节点,end表示当前层应该打印的节点。
- 将root加入队列,队列不为空,进入循环。弹出队列第一个元素,加入List集合,start+1。
- root的左节点不为空,加入队列。root的右节点不为空,加入队列。
- 当
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:把二叉树打印成多行的主要内容,如果未能解决你的问题,请参考以下文章