• 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解题之前,可以看提示,但一定不要看题解,看了就“破功”了!
  • 相关阅读:
    元数据管理-解决方案调研二:元数据管理解决方案——早期传统解决方案
    《算法竞赛·快冲300题》每日一题:“彩虹数”
    LeetCode(力扣)40. 组合总和 IIPython
    qemu虚拟化环境dpdk网卡tcp offloading
    uniapp打包微信小程序。报错:https://api.weixin.qq.com 不在以下 request 合法域名列表
    java servlet大学生旅游网站的设计与开发源码
    Elasticsearch:Open Crawler 发布技术预览版
    猿辅导联合多方专家共议新课标:语文将更强调“实践性”
    TCP协议
    执行计划--mysql详解(七)
  • 原文地址:https://blog.csdn.net/IT_Fly/article/details/136565809