给定一棵二叉树,返回其节点值,进行自下而上的层级遍历。(即从叶节点所在层到根节点所在层,从左到右逐层遍历)例如:给定一棵二叉树[3,9,20,null,null,15,7],3/\920/\157返回其自下而上的层次遍历为:[[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,而最终结果res还没有创建一个depth对应的list时,应该在res中创建一个新的list来保存这个depth的所有节点。constlevelOrderBottom=function(root){constres=[]vardep=function(node,depth){if(!node)返回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是树的高度
