题目大意:给定一个二叉树,从左到右,一层一层地返回所有节点的值遍历。
理解:题目要求对二叉树进行层序遍历,二叉树的层序遍历要用到队列,同时,题目还要求返回遍历的每层的值最为一个一维数组的二维数组。即给出二叉树{3,9,20,#,#,15,7},其中#表示该节点为空,则程序返回[[3],[9,20],[15,7]]。
由于每层用一个数组存储,则需要知道每次遍历时的该层有多少个节点。本方法中,visit即为每次需要扫描的该层节点个数,nextVisit则为记录下一次需要扫描的节点数,因为只有在扫描一层时才可以知道其下一层有多少个节点。
注意:Java的Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接口。实现:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
if(root == null) return arr;
Queue<TreeNode> queue = new LinkedList<TreeNode>(); // LinkedList实现
queue.offer(root);
int visit = 1, nextVisit = 0;
while(!queue.isEmpty()) {
TreeNode p = queue.peek();
ArrayList<Integer> a = new ArrayList<Integer>();
while(p != null && visit > 0) {
a.add(p.val);
if(p.left != null) {
queue.offer(p.left);
nextVisit ++;
}
if(p.right != null) {
queue.offer(p.right);
nextVisit ++;
}
queue.poll();
if(!queue.isEmpty())
p = queue.peek();
visit --;
}
arr.add(a);
if(nextVisit == 0) break;
visit = nextVisit;
nextVisit = 0;
}
return arr;
}
}