当前位置:   article > 正文

LeetCode剑指offer32从上到下打印二叉树II_剑指offer 32 — ii.从上到下打印二叉树 ii

剑指offer 32 — ii.从上到下打印二叉树 ii

难度:简单

题目:

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。


 例如:

给定二叉树: [3,9,20,null,null,15,7],

 

 返回其层次遍历结果:


 重点!!!解题思路

第一种解法--递归:

此题我们采用递归和栈的思想来解决问题

由于是层序遍历,需要返回的是二维集合

其中每一集合中都包含树的每一层

我们只需要每次遍历树的节点然后添加到集合中去,即为题解

源码+讲解:

  1. class Solution {
  2. List<List<Integer>> res; //创建二维集合
  3. public List<List<Integer>> levelOrder(TreeNode root) {
  4. res=new ArrayList<>();
  5. dfs(root,0);
  6. return res;
  7. }
  8. public void dfs(TreeNode root,int k){
  9. if(root==null) return;
  10. if(res.size()==k) res.add(new ArrayList<>());//每到新的一层都需要先创建一个子集
  11. res.get(k).add(root.val);//将节点值添加到子集中
  12. dfs(root.left,k+1);//k+1为下一层
  13. dfs(root.right,k+1);
  14. }
  15. }

运行结果:


 第二种解法--队列:

使用队列思想来实现

首先将节点和层数绑定起来作为一个Data

每次队列在队尾添加Data数据

添加之后出队判断 添加到集合中去,然后循环此步骤

源码+讲解:

  1. class Solution {
  2. //将root和层数绑定
  3. class Data{
  4. TreeNode root;
  5. int k;
  6. public Data(TreeNode root, int k) {
  7. this.root = root;
  8. this.k = k;
  9. }
  10. }
  11. List<List<Integer>> res; //创建二维集合
  12. public List<List<Integer>> levelOrder(TreeNode root) {
  13. res = new ArrayList<>();
  14. if (root==null) return res;
  15. Queue<Data> queue = new ArrayDeque<>();
  16. queue.offer(new Data(root,0));
  17. while (!queue.isEmpty()){ //当队列不为空时,出队,添加到集合
  18. Data cur = queue.poll();
  19. TreeNode curNode = cur.root;
  20. int k=cur.k;
  21. if (res.size()==k) res.add(new ArrayList<>());
  22. res.get(k).add(curNode.val);
  23. if (curNode.left!=null) queue.offer(new Data(curNode.left,k+1));
  24. if (curNode.right!=null) queue.offer(new Data(curNode.right,k+1));
  25. }
  26. return res;
  27. }
  28. }

运行结果:

 

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。 

系列持续更新中,点个订阅吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/1005055
推荐阅读
相关标签
  

闽ICP备14008679号