题解 | #求二叉树的层序遍历#
求二叉树的层序遍历
http://www.nowcoder.com/practice/04a5560e43e24e9db4595865dc9c63a3
思路:使用两个链表,来回跳跃。
- 链表的作用其实是模拟队列的功能。
- 首先queue1装载根结点root
- 将queue1的结点依次从头部出队列
1)若当前出队列的结点有左子结点,则将其入队列queue2.
2)若当前出队列的结点有右子结点,则将其入队列queue2.
3)将当前出队列的结点放入list中,该list是存储同一层的所有结点。
4)将list加入到res(返回用的ArrayList)中。 - 将queue2的结点依次从头部出队列
1)若当前出队列的结点有左子结点,则将其入队列queue1.
2)若当前出队列的结点有右子结点,则将其入队列queue1.
3)将当前出队列的结点放入list中,该list是存储同一层的所有结点。
4)将list加入到res(返回用的ArrayList)中。 - 只要queue1与queue2的size()不同时为0,则循环继续。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
if(root==null){
return res;
}
LinkedList<TreeNode> queue1=new LinkedList<>();
LinkedList<TreeNode> queue2=new LinkedList<>();
queue1.addLast(root);
while(queue1.size()!=0 || queue2.size()!=0){
ArrayList<Integer> list1=new ArrayList<>();
ArrayList<Integer> list2=new ArrayList<>();
while(queue1.size()!=0){
TreeNode tmp=queue1.removeFirst();
if(tmp.left!=null){
queue2.addLast(tmp.left);
}
if(tmp.right!=null){
queue2.addLast(tmp.right);
}
list1.add(tmp.val);
}
if(list1.size()!=0){
res.add(list1);
}
while(queue2.size()!=0){
TreeNode tmp=queue2.removeFirst();
if(tmp.left!=null){
queue1.addLast(tmp.left);
}
if(tmp.right!=null){
queue1.addLast(tmp.right);
}
list2.add(tmp.val);
}
if(list2.size()!=0){
res.add(list2);
}
}
return res;
}
}