描述
给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树多行打印层序遍历的结果是
[
[1],
[2,3],
[4,5]
]
数据范围:二叉树的节点数 0 \le n \le 10000≤n≤1000,0 \le val \le 10000≤val≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
输入描述:
给定一个二叉树的根节点
思路:层次遍历+判断每一层的结点是否遍历完毕
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.*;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode root) {
ArrayList<ArrayList<Integer>> ans = new ArrayList();
if(root == null)
return ans;
LinkedList<TreeNode> queue = new LinkedList();
queue.offer(root);
TreeNode p = null;
//flag1记录本层父节点是否全部弹出,flag2记录儿子节点的数量
int flag1 = 1;
int flag2 = 0;
ArrayList<Integer> a = new ArrayList();
while(!queue.isEmpty()){
p = queue.poll();
a.add(p.val);
if(p.left != null){
queue.offer(p.left);
flag2++;
}
if(p.right != null){
queue.offer(p.right);
flag2++;
}
//结点弹出,代表当前层结点数量的flag1--;
flag1--;
//通过flag1是否为0判断当前层节点是否遍历完
if(flag1 == 0){
//准备下一层节点的遍历
flag1 = flag2;
flag2 = 0;
//将存有一层节点值的数组链表a存入ans中
ans.add(a);
//新建a,为存入新一层节点的值做准备
a = new ArrayList();
}
}
return ans;
}
}
遇到问题:
在将存储一层节点值的数组a存入ans中后,需要新建一个数组a来存储新的一层节点值。刚开始在ans.add(a)后用的a.clear(),本想清空后存入元素,再把数组a存入ans中,结果发现存入ans的多个a其实引用的是同一个对象,导致答案错误
解决方法:
在ans.add(a)后使用a = new ArrayList()可以新建一个数组a,这个数组a和之前的数组a是两个不同的对象,问题解决