【剑指offer-60】把二叉树打印成多行
- 考点:队列 树
- 时间限制:1秒
- 空间限制:32768K
- 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:
队列LinkedList完成层序遍历,用end记录每层结点数目
代码:
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Queue;
import java.util.LinkedList;
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();
queue.add(pRoot);
ArrayList<Integer> temp = new ArrayList();
int start = 0, end = 1;
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
temp.add(cur.val);
start++;
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
if (start == end) {
end = queue.size();
start = 0;
list.add(temp);
temp = new ArrayList();
}
}
return list;
}
}
我的问题:
这个就是层次遍历了,但是要注意一点,要求按层保存,所以我们要注意每一层的结尾在哪里。这个通过queue的size来保存,start指针记录走到哪一步。当start==end的时候,就是这一层走完了,重置start为0,并且end等于queue的size大小,也就是下一层所具有的的节点数。
其他思路1:
递归做法:
利用递归的方法进行先序遍历,传递深度,递归深入一层扩容一层数组,先序遍历又保证了同层节点按从左到右入数
假如现在元素是[1,2,3],当进入2时会创建一个 arraylist,此时 depth = 2,size=2;当2遍历完后会进入3,此时3 就不用创建 arraylist 了,因为 2,3是同一层的,并且此时 depth==size 。这个判断是用来让最左的元素创建 arraylist 就行了,而同一层后边的元素共用这个 arraylist
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList();
depth(pRoot, 1, list);
return list;
}
private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
if (root == null) {
return;
}
// 如果传入的深度大小大于list大小,说明当前层还没有创建list
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);
}
}