题目
leetcode 102. 二叉树的层次遍历 给你一个二叉树,请你返回其按 层次遍历 得到的节点值。(即逐层地,从左到右访问所有节点)
「示例:」 二叉树:[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode 102) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
题解
方法1
「思想:」
宽度优先
利用队列实现宽度优先;
先将root入队,并插入一个分割节点;
只要队列不为空,元素依次出队,保存结果到相应层次的列表中;
将每次出队节点的非空孩子节点依次入队,一旦遍历到分割节点,将分割节点重新入队。
「代码:」
//层次遍历(宽度优先)
public List<List<Integer>> levelView1(TreeNode root){
if (root==null){
return null;
}
//初始化集合类
List<List<Integer>> ans=new ArrayList<>();
ArrayList<Integer> list=new ArrayList<>();
//初始化队列
Queue<TreeNode> queue=new LinkedList<>();
TreeNode insert=new TreeNode(0);
//根节点和插入节点入栈
queue.offer(root);
queue.offer(insert);
TreeNode temp;
while (!queue.isEmpty()){
temp=queue.poll();
if (temp==insert){ //插入点
ans.add(list);
list=new ArrayList<>();
if (!queue.isEmpty()) { //这里要判断队列中是否还有节点待处理
queue.offer(insert);
}
continue;
}
if (temp.left!=null){ //左孩子非空,入队
queue.offer(temp.left);
}
if (temp.right!=null){ //右孩子非空,入队
queue.offer(temp.right);
}
list.add(temp.val);
}
return ans;
}
方法2
「思想:」
深度优先
递归实现,保存节点的层次,将遍历到的节点存到相应集合中;
「代码:」
//深度优先遍历
public List<List<Integer>> levelView2(TreeNode root){
if (root==null){
return null;
}
List<List<Integer>> ans=new ArrayList<>();
levelView22(root,ans,1);
return ans;
}
private void levelView22(TreeNode root, List<List<Integer>> ans, int i) {
if (i>ans.size()){ //集合大小不够,需要新增一个子集合
ans.add(new ArrayList<>());
}
ans.get(i-1).add(root.val);
if (root.left!=null){
levelView22(root.left,ans,i+1);
}
if (root.right!=null){
levelView22(root.right,ans,i+1);
}
}