一、题目描述:
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如: 给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]
二、思路分析:
这题和102. 二叉树的层序遍历非常相似。 如果选择投机的办法,直接使用102的代码做一个微调就可以了,102的要求是自顶向下,本题的要求是自底向上。只需要在添加行数据时,每次添加到result数组index==0的位置就可以了。时间复杂度和空间复杂度依然是O(n)。
那有没有办法使用dfs的方式获取获取层序遍历的结果? 当然是可以的,深度遍历时只需要标记当前遍历的节点在哪一层,将当前节点添加到二维数组对应的行中就可以了。 时间复杂度和控件复杂度都是O(n)。
三、AC 代码:
这里分别使用dfs和bfs两种解法
class Solution {
fun levelOrderBottom(root: TreeNode?): List<List<Int>> {
return solution2(root)
}
fun solution2(root: TreeNode?): List<List<Int>> {
var result = mutableListOf<ArrayList<Int>>()
dfs(root, result, 0)
result.reverse()
return result
}
fun dfs(root: TreeNode?, res: MutableList<ArrayList<Int>>, level: Int) {
if (root == null)
return
if (level >= res.size) {
var list = mutableListOf<Int>()
res.add(list as ArrayList<Int>)
}
res[level].add(root.`val`)
dfs(root.left, res, level + 1)
dfs(root.right, res, level + 1)
}
// 层序遍历
fun solution1(root: TreeNode?): List<List<Int>> {
var result = mutableListOf<List<Int>>()
if (root == null) {
return result
}
var queue = LinkedList<TreeNode>()
queue.push(root)
var list = mutableListOf<TreeNode>()
while (queue.isNotEmpty()) {
list.addAll(queue)
queue.clear()
var level = mutableListOf<Int>()
for (item in list) {
level.add(item.`val`)
if (item.left != null) {
queue.add(item.left!!)
}
if (item.right != null) {
queue.add(item.right!!)
}
}
result.add(0, level)
list.clear()
}
return result
}
}
四、总结:
层序遍历不单单可以使用广搜,也可以使用深度搜索。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情