• 算法通关村第五关-二叉树遍历(层数优先)之经典问题:简单的层序遍历、层序遍历分层、自底向上的层序遍历


    基础知识(青铜挑战)

    实战训练(白银挑战)

    简单的层序遍历
    • 基本的层序遍历思路很清晰:

      • 给你一个二叉树根节点,你需要创建一个队列 queue 来遍历节点,一个链表 list 来存储节点的数据域,即值

      • 首先将根节点入队

      • 队列 queue 出队,将该节点值存入 list,再依次将左右孩子节点入队

      • 重复以上操作,每个节点出对后,都存储该节点值到 list 中,再依次将左右孩子节点入队,直到队列 queue为空

      • 这样得到的数据链表 list 就是按层序遍历的顺序得到的

    • 具体代码如下:(2023/09/09午)
    1. public static List simpleLevelOrder(TreeNode root) {
    2.        if (root == null) {
    3.            return new ArrayList();
    4.       }
    5.        List res = new ArrayList();
    6.        LinkedList queue = new LinkedList();
    7.        //将根节点放入队列中,然后不断遍历队列
    8.        queue.add(root);
    9.        //有多少元素执行多少次
    10.        while (queue.size() > 0) {
    11.            //获取当前队列的长度,这个长度相当于 当前这一层的节点个数
    12.            TreeNode t = queue.remove();
    13.            res.add(t.val);
    14.            if (t.left != null) {
    15.                queue.add(t.left);
    16.           }
    17.            if (t.right != null) {
    18.                queue.add(t.right);
    19.           }
    20.       }
    21.        return res;
    22.   }
    层序遍历分层
    • 层序遍历我们做到了,这里添加一个要求:对层序遍历的节点值分层处理,即二叉树每层的节点值分别存放进一个链表 list 中

    • 这个代码怎么写呢?很简单的,按这个思路走:

      • 我们之前层序遍历时,每出队一个节点,都把其值存入 list 链表中,然后入队其孩子节点

      • 在开始出队某一层的节点时,此时队列的节点数,就是二叉树这一层的节点数

      • 那我们根据可以某时刻队列容量来遍历队列,将这层的节点全部出队,并且把节点值存入该层独有的 list 中

      • 当然了,每个节点出队后,要将自己的孩子节点依次入队

      • 这样,当队列为空时,我们得到了各层的节点链表 list,返回一个包含各层 list 的 list 即可

    • 具体代码如下:(2023/09/09晚)
    1.  public static List> level102Order(TreeNode root) {
    2.        if (root == null) {
    3.            return new ArrayList>();
    4.       }
    5.        List> res = new ArrayList>();
    6.        LinkedList queue = new LinkedList();
    7.        //将根节点放入队列中,然后不断遍历队列
    8.        queue.add(root);
    9.        while (queue.size() > 0) {
    10.            //获取当前队列的长度,这个长度相当于 当前这一层的节点个数
    11.            int size = queue.size();
    12.            ArrayList tmp = new ArrayList();
    13.            //将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
    14.            //如果节点的左/右子树不为空,也放入队列中
    15.            for (int i = 0; i < size; ++i) {
    16.                TreeNode t = queue.remove();
    17.                tmp.add(t.val);
    18.                if (t.left != null) {
    19.                    queue.add(t.left);
    20.               }
    21.                if (t.right != null) {
    22.                    queue.add(t.right);
    23.               }
    24.           }
    25.            //将临时list加入最终返回结果中
    26.            res.add(tmp);
    27.       }
    28.        return res;
    29.   }
    自底向上的层序遍历
    • 在前面学习的基础上,实现这个要求就很简单了

    • 在拿到各层节点值的 list 后,按头插的方式,插入链表 list 中,就实现了自底向上的层序遍历了(2023/09/09晚)
    • 具体代码如下:
      
    
    1. public static List> levelOrderBottom(TreeNode root) {
    2.        List> levelOrder = new LinkedList>();
    3.        if (root == null) {
    4.            return levelOrder;
    5.       }
    6.        Queue queue = new LinkedList();
    7.        queue.offer(root);
    8.        while (!queue.isEmpty()) {
    9.            List level = new ArrayList();
    10.            int size = queue.size();
    11.            for (int i = 0; i < size; i++) {
    12.                TreeNode node = queue.poll();
    13.                level.add(node.val);
    14.                TreeNode left = node.left, right = node.right;
    15.                if (left != null) {
    16.                    queue.offer(left);
    17.               }
    18.                if (right != null) {
    19.                    queue.offer(right);
    20.               }
    21.           }
    22.            levelOrder.add(0, level);//栈
    23.       }
    24.        return levelOrder;
    25.   }

  • 相关阅读:
    018、集合_应用场景
    【点云处理】点云法向量估计及其加速(5)
    Redis6 六:Redis常用五大数据类型—— 集合Set 、 哈希hash 和 有序集合Zset
    浅梳理JS对字符串的操作
    18.2 使用NPCAP库抓取数据包
    高速公路堵车动力学
    Hive分区表和分桶表
    Linux的基本使用(一)
    交互式shell和非交互式shell、登录shell和非登录shell
    根据表单控件名称,获取对应指定字段名称
  • 原文地址:https://blog.csdn.net/m0_62570784/article/details/133459869