给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
解题思路:
层次遍历,必须借助队列,采用先进先出的规则,把每层的每个节点存进去,然后依次退出来。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> node = new ArrayList<>();
if(root==null) {
return list;
}
levelOrderTree(root,list);
//System.out.println(list);
return list;
}
public static void levelOrderTree(TreeNode root,List<List<Integer>> ret) {
//用来标记下一层有几个节点
int nextcount=0;
//用来标记当前层的节点个数,如果为0,就进入到下一层了
int curCount = 1; //根节点1个
//先把根节点入队列
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);//加入元素,如果队列满了也不报错,返回false
List<Integer> onelevel = new ArrayList<>();
while(!q.isEmpty()) {
//只要队列不为空,就一层层处理
TreeNode node=q.poll();//移除元素
curCount--;
onelevel.add(node.val); //这层的都放进去
if(node.left!=null) {
q.offer(node.left);
nextcount++;
}
if(node.right!=null) {
q.offer(node.right);
nextcount++;
}
if(curCount==0){//当前层走完,走到下一层
curCount=nextcount;
nextcount=0;
ret.add(new ArrayList<>(onelevel));
onelevel.clear();
}
}
}
}