题解 | #求二叉树的层序遍历#

求二叉树的层序遍历

https://www.nowcoder.com/practice/04a5560e43e24e9db4595865dc9c63a3

思路

本题主要难点在于如何将当层遍历结果组成集合加入到结果集

利用队列来进行层序遍历,每当进行一层遍历时,统计当前队列中节点数创建相应大小本层结果集合进行接收,出队时,将出队节点子节点加入下层队列中 步骤:

主方法:

  1. 创建一个结果集合,创建一个初始辅助队列,并在根节点判空后将根节点加入队列中
  2. 将结果集合与辅助队列传入层序遍历方法中
  3. 返回结果集合

层序遍历方法:

  1. 统计本层队列节点总数,如果节点数等于0直接返回(方法出口),通过节点数创建相应大小的本层结果集合
  2. 创建下层层序遍历所需要的辅助队列(这样就分离开了本层辅助队列与下层辅助队列)
  3. 使用while循环,循环中先将弹出节点的左右子节点加入下层辅助队列中(如果该节点左右子节点存在的话),将当前节点值加入本层结果集合中,并弹出该节点
  4. while循环结束后,将本层结果集合加入到传入的结果集合中,递归调用该方法,传入结果集合与下层辅助队列(也可以将方法出口设置在此)
  5. 直到下层辅助队列为空(即本层队列节点总数为0)时,层序遍历结束,返回结果集合

代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
    * @param root TreeNode类
    * @return int整型ArrayList<ArrayList <>>
    */
    public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        // 创建集合
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        // 创建辅助队列
        Queue<TreeNode> queue = new LinkedList<>();
        if (root != null) {
            // 将根节点加入队列中
            queue.add(root);
        }
        // 层序遍历
        levelOrder(result, queue);
        // 返回结果
        return result;
    }

    /**
     * 对二叉树进行层序遍历
     *
     * @param result 遍历结果集合
     * @param queue  辅助队列
     * @apiNote
     * @since 2022/12/29 20:52
     */
    public void levelOrder(List<ArrayList<Integer>> result, Queue<TreeNode> queue) {
        // 统计本层节点数
        int size = queue.size();
        if (size == 0) {
            return;
        }
        // 创建本层结果集合
        ArrayList<Integer> resultArray = new ArrayList<>(size);
        // 创建下层辅助队列
        Queue<TreeNode> nextQueue = new LinkedList<>();
        // 弹出队列节点
        while (!queue.isEmpty()) {
            // 将弹出节点的左右节点加入新队列中
            if (queue.peek().left != null) {
                nextQueue.add(queue.peek().left);
            }
            if (queue.peek().right != null) {
                nextQueue.add(queue.peek().right);
            }
            // 将当前节点值加入本层结果集合中
            resultArray.add(queue.poll().val);
        }
        // 将本层结果集合加入结果集合中
        result.add(resultArray);
        // 继续下一层的层序遍历
        if (!nextQueue.isEmpty()) {
            levelOrder(result, nextQueue);
        }
    }
}
全部评论

相关推荐

10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务