题目:
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
抛砖引玉
思路
二叉树遍历:
- 广度优先搜索(BFS),将待遍历的元素存放到数组中,一层层遍历
- 深度优先搜索(DFS),选择一个元素将其遍历至最里层
可以发现其实广度优先搜索的逻辑更符合本题要要求。
广度优先搜索(BFS)
从根节点开始遍历,遍历一个元素就将其从queue中取出,将其下一层放入queue中待下次遍历
每一层遍历均记录子元素数组,且存放到结果数组中
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrderBottom = function(root) {
let _result = [],
queue = [];
if (root == null) return [];
queue.push(root);
while (queue.length) {
let len = queue.length,
levelNodes = [];
for (let i = 0; i < len; i++) {
let node = queue.shift();
levelNodes.push(node.val);
if (node.left) {
queue.push(node.left);
}
if (node.right) {
queue.push(node.right);
}
}
_result.push(levelNodes);
}
return _result.reverse();
};
深度优先搜索(DFS)
边遍历边生成结果数组
递归:
- 参数:待遍历的节点,当前节点属于的层级数
- 终止:传入的节点为null
var levelOrderBottom = function(root) {
let _result = [];
if (root == null) return [];
function dfs(node, level) {
if (!node) return
if (_result[level]) {
_result[level].push(node.val)
} else {
_result[level] = [node.val];
}
level++;
dfs(node.left, level);
dfs(node.right, level);
}
dfs(root, 0)
return _result.reverse();
};
博客: 小书童博客
每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目
欢迎关注留言
公号: 前端小书童