102. 二叉树的层序遍历
1.题目描述及示例
- 题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 - 示例
2.题解思路及代码
-
思路
主要是怎么确定每层有多少个。当第i层的第一个节点开始出队时,第i+1层的第一个节点开始入队。当第i层的最后一个节点出队时,第i+1层的最后一个节点也入队了。也就是说,此时队里只有i+1层的节点。这样一层层的遍历。 -
代码
public List<List<Integer>> levelOrder(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<>();
List<List<Integer>> ans = new ArrayList<>();
if(root == null){
return ans;
}
queue.add(root);
while (!queue.isEmpty()){
int size = queue.size();
List<Integer> sum = new ArrayList<>();
for(int i = 0; i < size; i++) {
TreeNode temp = queue.pop();
sum.add(temp.val);
if(temp.left != null){
queue.add(temp.left);
}
if(temp.right != null){
queue.add(temp.right);
}
}
ans.add(sum);
}
return ans;
}
我之前是通过记录每层最右端的节点来将层与层分开的,这样有点笨。
//我的代码
public List<List<Integer>> levelOrder(TreeNode root) {
TreeNode p=root,currentLayerLastNode=root;
List<TreeNode> que=new ArrayList<>();
if (p!=null)
que.add(p);
List<Integer>smallList=new ArrayList<>();
List<List<Integer>>bigList=new ArrayList<>();
while (!que.isEmpty())
{
p=que.remove(0);
smallList.add(p.val);
if (p==currentLayerLastNode)
{
bigList.add(smallList);
smallList=new ArrayList<>();
if (currentLayerLastNode.right!=null)
currentLayerLastNode=currentLayerLastNode.right;
else if (currentLayerLastNode.left!=null)
currentLayerLastNode=currentLayerLastNode.left;
else if (!que.isEmpty())
currentLayerLastNode=que.get(que.size()-1);
}
if (p.left!=null)
que.add(p.left);
if (p.right!=null)
que.add(p.right);
}
return bigList;
}