当前位置:   article > 正文

二叉树的层序遍历_队列实现二叉树的层次遍历

队列实现二叉树的层次遍历

 对于二叉树的层序遍历,我们可以使用广度优先搜索解决。

 思路分析:

1:定义一个队列,利用队列先进先出的准则,先将根节点存入到队列中

2:当队列中元素不为空时,记录队列中的元素个数,并依次取出队列中的节点元素,并将取出的元素添加到子集合中去。当节点元素有左子树或者右子树时,将左子树或者右子树入队列

3:再次统计队列中的新加入节点后的所有节点个数并且依次取出,重复上述操作,就能逐层的遍历二叉树

  1. class Solution {
  2. public List<List<Integer>> levelOrder(TreeNode root) {
  3. List<List<Integer>> list=new ArrayList<>();
  4. //先对根节点是否为空值进行判断
  5. if(root==null){
  6. return list;
  7. }
  8. //定义一个队列用于存放二叉树的每一层的节点
  9. Queue<TreeNode> queue=new LinkedList<>();
  10. //先把二叉树根节点存放到队列中
  11. queue.offer(root);
  12. //当队列中没有节点时推出循环
  13. while(!queue.isEmpty()){
  14. //定义子集合,用于存放二叉树每一层的节点的值
  15. List<Integer> subList=new ArrayList<>();
  16. //定义一个记录队列中元素个数的变量
  17. int size=queue.size();
  18. for(int i=0;i<size;i++){
  19. //定义一个节点,记录队列中的元素,并依次将队列中的元素出队列
  20. TreeNode node=queue.poll();
  21. //将出队列中的元素依次添加到子集合中
  22. subList.add(node.val);
  23. //判断当前根节点的左右节点是否存在
  24. //如果当前根节点有左子树,则将左子节点添加到队列中
  25. if(node.left!=null){
  26. queue.offer(node.left);
  27. }
  28. //如果当前根节点有右子树,则将右子节点添加到队列中
  29. if(node.right!=null){
  30. queue.offer(node.right);
  31. }
  32. }//第i轮循环后,即二叉树的第i层的所有节点信息全部进入队列中
  33. //将队列中的信息存放到集合中
  34. list.add(subList);
  35. }
  36. return list;
  37. }
  38. }

 

在遍历完一层节点之后,将存储该层节点值的列表添加到结果列表的头部。 就能实现自底向上的层序遍历

  1. class Solution {
  2. public List<List<Integer>> levelOrderBottom(TreeNode root) {
  3. //初始化一个集合
  4. List<List<Integer>> list=new ArrayList<>();
  5. //判断根节点是否为空
  6. if(root==null){
  7. return list;
  8. }
  9. //初始化栈,利用栈先进后出的准则,实现自底向上的层序遍历
  10. Queue<TreeNode> queue=new LinkedList<>();
  11. //将根节点压入栈底
  12. queue.offer(root);
  13. while(!queue.isEmpty()){
  14. //初始化一个子集合
  15. List<Integer> subList=new ArrayList<>();
  16. //定义一个变量用于统计栈中的元素个数
  17. int size=queue.size();
  18. for(int i=0;i<size;i++){
  19. //定义一个node变量,用于接收出栈的节点信息
  20. TreeNode node = queue.poll();
  21. //每遍历一次栈中的元素,就把弹出栈的元素加入到集合中
  22. subList.add(node.val);
  23. //判断根节点是否有左右子树
  24. //判断根节点的左子树是否为空
  25. if(node.left!=null){
  26. //将左子节点压入栈
  27. queue.offer(node.left);
  28. }
  29. //判断根节点的右子树是否为空
  30. if(node.right!=null){
  31. //将右子节点压入栈
  32. queue.offer(node.right);
  33. }
  34. }
  35. //在遍历完一层节点之后,将存储该层节点值的列表添加到结果列表的头部。
  36. list.add(0,subList);
  37. }
  38. return list;
  39. }
  40. }

 

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

闽ICP备14008679号