「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。
题目
链接:leetcode-cn.com/problems/bi…
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例 1:
**输入:**root = [3,9,20,null,null,15,7] 输出:[[15,7],[9,20],[3]]
示例 2:
**输入:**root = [1] 输出:[[1]]
示例 3:
**输入:**root = [] 输出:[]
提示:
- 树中节点数目在范围
[0, 2000]内 -1000 <= Node.val <= 1000
思路
BFS框架
// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
Queue<Node> q; // 核心数据结构
Set<Node> visited; // 避免走回头路
q.offer(start); // 将起点加入队列
visited.add(start);
int step = 0; // 记录扩散的步数
while (q not empty) {
int sz = q.size();
/* 将当前队列中的所有节点向四周扩散 */
for (int i = 0; i < sz; i++) {
Node cur = q.poll();
/* 划重点:这里判断是否到达终点 */
if (cur is target)
return step;
/* 将 cur 的相邻节点加入队列 */
for (Node x : cur.adj())
if (x not in visited) {
q.offer(x);
visited.add(x);
}
}
/* 划重点:更新步数在这里 */
step++;
}
}
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrderBottom = function(root) {
if(!root){
return []
}
let queue = []
let level = []
queue.push(root) // 开始搜索
while(queue.length){
let size = queue.length
let curLevel = []
for(let i=0;i<size;i++){
let cur = queue.shift()
curLevel.push(cur.val)
// ! 如何判断终点
// 这里不需要终点 因为我们要遍历整颗树 注意BFS 没有用递归 终点不是递归的base case
if(cur.left){
queue.push(cur.left)
}
if(cur.right){
queue.push(cur.right)
}
}
level.unshift(curLevel)
}
return level
};
思路2
1.用数组保存当前层节点
2.边遍历数组,边保存下一层节点
实现:
用队列Q保存当前层节点
遍历当前队列Q的长度curLen,边遍历边把下一层节点添加到队列Q中
当curLen 遍历完毕时,设置下一层遍历长度
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrderBottom = function(root) {
if(!root) return []
let queue = [root]
let i = queue.length
let c = []
let result = []
while(i>0){
let cur = queue.shift()
c.push(cur.val)
if(cur.left) queue.push(cur.left)
if(cur.right) queue.push(cur.right)
i--
if(i===0){
result.push(c)
c = []
i = queue.length
}
}
return result.reverse()
};