一、题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例: 二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[ [3], [9,20], [15,7] ]
题目链接:102. 二叉树的层序遍历
二、思路分析:
二叉树的层序遍历类似于广度优先遍历,只是一般广度优先遍历我们得到一个数组即可。
层序遍历,我们需要给广度优先遍历的结果分层显示。
-
我们可以创建一个记录二叉树层数的数组 levelArr;
-
在根节点不为空的情况下,把根节点添加到 levelArr;
-
while循环 遍历 levelArr ,记 levelArr 的数量 levelSize;levelSize 表示当前层有几个树结点,声明并初始化 tempArr 用于记录当前层树结点的值,tempArr 起着隔离开每层数据的作用。
-
for 循环 依次遍历当层的左右子树,遍历过程中,更新 levelArr 中的结点。(包括移除 levelArr 第一个结点,及往 levelArr 添加新结点)
-
在 for 循环结束后,把 tempArr 添加到 resultArr 中;
-
最后返回resultArr 即可。
三、AC 代码:
class Solution {
func levelOrder(_ root: TreeNode?) -> [[Int]] {
var resultArr : [[Int]] = [[Int]]();
if (root == nil) {
// 空树
return resultArr;
}
// 记录每一层的结点数组levelArr
var levelArr : [TreeNode?] = [TreeNode?]();
levelArr.append(root);
while (levelArr.count > 0) {
var tempArr : [Int] = [Int]();
let levelSize = levelArr.count;
// 遍历当前层几个结点的左右子树并处理
for _ in 0..<levelSize {
// 先添加到数组中的元素靠左 所以要使用从前边开始移除元素
let node : TreeNode? = levelArr.removeFirst();
tempArr.append(node?.val ?? 0);
if (node?.left != nil) {
levelArr.append(node?.left);
}
if (node?.right != nil) {
levelArr.append(node?.right);
}
}
resultArr.append(tempArr);
}
return resultArr;
}
}
四、参考学习网址
本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情