• LeetCode-102.题: 二叉树的层序遍历(原创)


    【题目描述】

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

    示例 1:

    输入:root = [3,9,20,null,null,15,7]
    输出:[[3],[9,20],[15,7]]

    【题目链接】. - 力扣(LeetCode)

    【解题代码】

    1. package tree.binarytree;
    2. import java.util.*;
    3. public class LevelOrderTraversal {
    4. public static void main(String[] args) {
    5. Integer[] array = new Integer[]{1,2,3,4,null,null,5};
    6. TreeNode root = TreeNode.constructTree(array);
    7. List> lists = new LevelOrderTraversal().levelOrder(root);
    8. lists.forEach(l -> System.out.println(Arrays.toString(l.toArray())));
    9. }
    10. private List> levelOrder(TreeNode root) {
    11. // 特殊情况处理,如果树根节点为空,返回空列表
    12. if (root == null) return new ArrayList<>();
    13. // 定义一个队列,临时存放所访问的树节点
    14. Queue queue = new LinkedList<>();
    15. // 首先将树的根节点放入队列中
    16. queue.add(root);
    17. TreeNode node;
    18. // 存储所有层节点列表的列表
    19. List> lists = new ArrayList<>();
    20. // 初始化当前父节点个数为1(即根节点),以及子节点个数
    21. int curLevelCount = 1, nextLevelCount = 0;
    22. // 当前层节点列表
    23. List list = new ArrayList<>();
    24. while (curLevelCount > 0) {
    25. // 从队列里弹出一个父节点,并将父节点数据减1
    26. node = queue.poll();
    27. curLevelCount--;
    28. // 将此父节点放入当前层节点列表
    29. list.add(node.val);
    30. // 如果此节点左子节点不为空,放入队列中,并将子节点数目加1
    31. if (node.left != null) {
    32. queue.add(node.left);
    33. nextLevelCount++;
    34. }
    35. // 如果此节点右子节点不为空,放入队列中,并将子节点数目加1
    36. if (node.right != null) {
    37. queue.add(node.right);
    38. nextLevelCount++;
    39. }
    40. // 如果当前层父节点访问完毕
    41. if (curLevelCount == 0){
    42. // 将当前层节点,拷贝到结果列表中,并进行清空
    43. lists.add(new ArrayList<>(list));
    44. list.clear();
    45. // 然后将下一层所有节点作为当前层节点,重启新一轮的遍历
    46. curLevelCount = nextLevelCount;
    47. nextLevelCount = 0;
    48. }
    49. }
    50. // 最后返回结果
    51. return lists;
    52. }
    53. }

    【解题思路】

            我们之前数据结构学习树遍历的内容,一般都是左、中、右三种遍历循序,按树的层次遍历还没处理过,需要自行思考,不能借鉴教科书了,深入反复思考,得出以下几个要点

    1. 第一层就一个节点,树的根节点,第二层就是根节点的左右子节点,第三层就是根节点的左右子节点的所有左右子节点,后面以此类推。。。
    2. 每次我们可以在队列中保存当前层的树节点,然后一一弹出,放入当前层列表中,并将其子节点放入队列中
    3. 当前层访问结束后,剩下的就是当前层的下一层所有节点。将其设置为新的当前层,反复循环处理即可

    按照这个思路,很快就写出算法代码,并提交成功,解题步骤如下:

    【解题步骤】

    1. 定义当前层树节点列表以及结果所有层节点列表
      1. // 定义一个队列,临时存放所访问的树节点
      2. Queue queue = new LinkedList<>();
      3. // 存储所有层节点列表的列表
      4. List> lists = new ArrayList<>();
    2. 定义一个队列,临时存放所访问的树节点,首先将树的根节点放入队列中
      1. // 定义一个队列,临时存放所访问的树节点
      2. Queue queue = new LinkedList<>();
      3. // 存储所有层节点列表的列表
      4. queue.add(root);
    3. 初始化当前父节点个数为1(即根节点),以及子节点个数
      int curLevelCount = 1, nextLevelCount = 0;
    4. 依次遍历当前层所有节点,一一从队列里弹出,放入当前层节点列表
      1. while (curLevelCount > 0) {
      2. // 从队列里弹出一个父节点,并将父节点数据减1
      3. node = queue.poll();
      4. curLevelCount--;
      5. // 将此父节点放入当前层节点列表
      6. list.add(node.val);
    5. 将其左右子节点作为下一层节点加入队列中
      1. // 如果此节点左子节点不为空,放入队列中,并将子节点数目加1
      2. if (node.left != null) {
      3. queue.add(node.left);
      4. nextLevelCount++;
      5. }
      6. // 如果此节点右子节点不为空,放入队列中,并将子节点数目加1
      7. if (node.right != null) {
      8. queue.add(node.right);
      9. nextLevelCount++;
      10. }
    6. 如果当前层所有节点遍历完毕,将当前层节点,拷贝到结果列表中,并进行清空,然后将下一层所有节点作为当前层节点,重启新一轮的遍历
      1. // 如果当前层父节点访问完毕
      2. if (curLevelCount == 0){
      3. // 将当前层节点,拷贝到结果列表中,并进行清空
      4. lists.add(new ArrayList<>(list));
      5. list.clear();
      6. // 然后将下一层所有节点作为当前层节点,重启新一轮的遍历
      7. curLevelCount = nextLevelCount;
      8. nextLevelCount = 0;
      9. }
    7. 最后返回结果
      return lists;

    【思考总结】

    1. 这道理的关键点在于“自顶向下,一层接一层交替访问树节点”;
    2. 算法设计时,可以考虑最简单的情况,试探思考其运行逻辑应该是什么样的
    3. 还是要有精细化的逻辑思维,层次分明,这样在复杂的逻辑也不会乱;
    4. LeetCode解题之前,可以看提示,但一定不要看题解,看了就“破功”了!
  • 相关阅读:
    Mybatis plus
    微机原理——汇编指令(上部)
    三维模型3DTile格式轻量化的数据压缩与性能平衡关系分析
    【iOS】UI学习(一)
    RedHat公司及红帽认证介绍丨红帽认证等级介绍
    OpenCV入门(C++/Python)- 使用OpenCV调整尺寸大小(三)
    MYSQL日期函数_MYSQL时间函数详解和实战(你想要的都有70多个函数几百种用法建议收藏以备查阅)
    652.寻找重复的子树
    Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集
    AMEYA360:永铭固液混合铝电解电容帮助企业级固态硬盘稳定运行
  • 原文地址:https://blog.csdn.net/IT_Fly/article/details/136565809