题记:
给你二叉树的根节点 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)