赞
踩
难度:简单
题目:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [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;
- }
- }
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。