给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:给定二叉树 [3,9,20,null,null,15,7] ,
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
- [
- [15,7],
- [9,20],
- [3]
- ]
解法一:BFS(广度优先遍历)
BFS 是按层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这题用 BFS 来做非常合适。BFS 需要用队列作为辅助结构,我们先将根节点放到队列中,然后不断遍历队列。
- constlevelOrderBottom=function(root){
- if(!root)return[]
- letres=[],
- queue=[root]
- while(queue.length){
- letcurr=[],
- temp=[]
- while(queue.length){
- letnode=queue.shift()
- curr.push(node.val)
- if(node.left)temp.push(node.left)
- if(node.right)temp.push(node.right)
- }
- res.push(curr)
- queue=temp
- }
- returnres.reverse()
- };
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
解法二:DFS(深度优先遍历)
DFS 是沿着树的深度遍历树的节点,尽可能深地搜索树的分支
DFS 做本题的主要问题是:DFS 不是按照层次遍历的。为了让递归的过程中同一层的节点放到同一个列表中,在递归时要记录每个节点的深度 depth 。递归到新节点要把该节点放入 depth 对应列表的末尾。
当遍历到一个新的深度 depth ,而最终结果 res 中还没有创建 depth 对应的列表时,应该在 res 中新建一个列表用来保存该 depth 的所有节点。
- constlevelOrderBottom=function(root){
- constres=[]
- vardep=function(node,depth){
- if(!node)return
- res[depth]=res[depth]||[]
- res[depth].push(node.val)
- dep(node.left,depth+1)
- dep(node.right,depth+1)
- }
- dep(root,0)
- returnres.reverse()
- };
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(h),h为树的高度
原文链接:https://mp.weixin.qq.com/s/gfvV_MFbHT9bX_DTobnEbg