Bootstrap

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

题记:

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

示例 1:
在这里插入图片描述

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

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnldjj/
来源:力扣(LeetCode)

解题方法:

一:BFS解决(宽度/广度优先搜索)

这题和剑指 Offer 32 - I. 从上到下打印二叉树其实是一样的,只不过上一题返回的是数组,这一题返回的是list。返回数组,我们还要初始化数组,但不知道数组的大小,所以一般是先储存在list中再转化为数组,返回list就比较简单了。
在这里插入图片描述

public List<List<Integer>> levelOrder(TreeNode root) {
    //边界条件判断
    if (root == null)
        return new ArrayList<>();
    //队列
    Queue<TreeNode> queue = new LinkedList<>();
    List<List<Integer>> res = new ArrayList<>();
    //根节点入队
    queue.add(root);
    //如果队列不为空就继续循环
    while (!queue.isEmpty()) {
        //BFS打印,levelNum表示的是每层的结点数
        int levelNum = queue.size();
        //subList存储的是每层的结点值
        List<Integer> subList = new ArrayList<>();
        for (int i = 0; i < levelNum; i++) {
            //出队
            TreeNode node = queue.poll();
            subList.add(node.val);
            //左右子节点如果不为空就加入到队列中
            if (node.left != null)
                queue.add(node.left);
            if (node.right != null)
                queue.add(node.right);
        }
        //把每层的结点值存储在res中,
        res.add(subList);
    }
    return res;
}

转换为PHP代码为:

function levelOrder($root) {
    //BFS(宽度/广度优先搜索)
    //边界条件判断
    if($root == null)
        return [];
    //队列
    $queue = [];
    $res = [];
    //根节点入队
    array_push($queue,$root);
    //如果队列不为空就继续循环
    while(!empty($queue)){
        //BFS打印,levelNum表示的是每层的节点数
        $levelNum = count($queue);
        //subList存储的是每层的节点值
        $subList = [];
        for($i = 0; $i < $levelNum; $i++){
            //出队
            $node = array_shift($queue);
            array_push($subList,$node->val);
            //左右子节点如果不为空就加入到队列中
            if($node->left != null)
                array_push($queue,$node->left);
            if($node->right != null)
                array_push($queue,$node->right);
        }
        //把每层的节点值存储在res中
        array_push($res,$subList);
    }
    return $res;
}

二:DFS解决(深度优先搜索)

这题让一层一层的打印,其实就是BFS,但使用DFS也是可以解决的,看一下

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    levelHelper(res, root, 0);
    return res;
}

public void levelHelper(List<List<Integer>> list, TreeNode root, int level) {
    //边界条件判断
    if (root == null)
        return;
    //level表示的是层数,如果level >= list.size(),说明到下一层了,所以
    //要先把下一层的list初始化,防止下面add的时候出现空指针异常
    if (level >= list.size()) {
        list.add(new ArrayList<>());
    }
    //level表示的是第几层,这里访问到第几层,我们就把数据加入到第几层
    list.get(level).add(root.val);
    //当前节点访问完之后,再使用递归的方式分别访问当前节点的左右子节点
    levelHelper(list, root.left, level + 1);
    levelHelper(list, root.right, level + 1);
}

方法来源:
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnldjj/?discussion=UHhgqh
来源:力扣(LeetCode)

;