题解 | #求二叉树的层序遍历#
求二叉树的层序遍历
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; } }