难度:简单
题目:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
返回其层次遍历结果:
重点!!!解题思路
第一种解法--递归:
此题我们采用递归和栈的思想来解决问题
由于是层序遍历,需要返回的是二维集合
其中每一集合中都包含树的每一层
我们只需要每次遍历树的节点然后添加到集合中去,即为题解
源码+讲解:
class Solution {
List<List<Integer>> res; //创建二维集合
public List<List<Integer>> levelOrder(TreeNode root) {
res=new ArrayList<>();
dfs(root,0);
return res;
}
public void dfs(TreeNode root,int k){
if(root==null) return;
if(res.size()==k) res.add(new ArrayList<>());//每到新的一层都需要先创建一个子集
res.get(k).add(root.val);//将节点值添加到子集中
dfs(root.left,k+1);//k+1为下一层
dfs(root.right,k+1);
}
}
运行结果:
第二种解法--队列:
使用队列思想来实现
首先将节点和层数绑定起来作为一个Data
每次队列在队尾添加Data数据
添加之后出队判断 添加到集合中去,然后循环此步骤
源码+讲解:
class Solution {
//将root和层数绑定
class Data{
TreeNode root;
int k;
public Data(TreeNode root, int k) {
this.root = root;
this.k = k;
}
}
List<List<Integer>> res; //创建二维集合
public List<List<Integer>> levelOrder(TreeNode root) {
res = new ArrayList<>();
if (root==null) return res;
Queue<Data> queue = new ArrayDeque<>();
queue.offer(new Data(root,0));
while (!queue.isEmpty()){ //当队列不为空时,出队,添加到集合
Data cur = queue.poll();
TreeNode curNode = cur.root;
int k=cur.k;
if (res.size()==k) res.add(new ArrayList<>());
res.get(k).add(curNode.val);
if (curNode.left!=null) queue.offer(new Data(curNode.left,k+1));
if (curNode.right!=null) queue.offer(new Data(curNode.right,k+1));
}
return res;
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧