思路:层次遍历。设计一个列表存储最后结果,一个队列用来存储二叉树结点。
public int[] levelOrder(TreeNode root) {
if (root ==null)
return new int[0];
Queue<TreeNode> queue = new LinkedList<TreeNode>();
List<Integer> list = new ArrayList<Integer>();
queue.add(root);
while (!queue.isEmpty()){
TreeNode node = queue.poll();
list.add(node.val);
if (node.left!=null)
queue.add(node.left);
if (node.right!=null)
queue.add(node.right);
}
int result[] = new int[list.size()];
for (int i=0;i<list.size();i++)
result[i] = list.get(i);
return result;
}
剑指 Offer 32 - II. 从上到下打印二叉树 II
思路:设计result用来存储结果,list用来存储每层节点信息,queue用来遍历。用null做分隔符,注意怎样判断分层,以及分层的时候要加入null做分层符
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();//存储结果
List<Integer> list = new ArrayList<>();//存储每层
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
queue.add(null);//用null做分隔符
while (!queue.isEmpty()){
TreeNode node = queue.poll();
if (node == null)//是分层符则退出循环
break;
list.add(node.val);
if (node.left!=null)
queue.add(node.left);
if (node.right!=null)
queue.add(node.right);
//若队列不空且队首元素为空,说明这层元素遍历完了
if (!queue.isEmpty()&&queue.peek()==null){
result.add(list);
list = new ArrayList<>();
queue.poll();//去掉队首的空元素
queue.add(null);//在队尾加上分层符
}
}
return result;
}
剑指 Offer 32 - III. 从上到下打印二叉树 III
思路:在上个题目的基础上,加上奇数层翻转下存储的元素,偶数层不用处理。注意count初始值的设置,还有奇偶层处理方式。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
int count = 1;
queue.add(root);
queue.add(null);
while (!queue.isEmpty()){
TreeNode node = queue.poll();
if (node == null){
break;
}//是分层符则退出循环
list.add(node.val);
if (node.right!=null)
queue.add(node.right);
if (node.left!=null)
queue.add(node.left);
//若队列不空且队首元素为空,说明这层元素遍历完了
//奇数行需要调换顺序,偶数行不用
if (!queue.isEmpty()&&queue.peek()==null){
if (count%2==1)
Collections.reverse(list);
result.add(list);
list = new ArrayList<>();
queue.poll();//去掉队首的空元素
queue.add(null);//在队尾加上分层符
count++;
}
}
return result;
}