服务器之家

服务器之家 > 正文

每日算法:二叉树的层次遍历

时间:2021-09-15 23:32     来源/作者:三分钟学前端

每日算法:二叉树的层次遍历

给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:给定二叉树 [3,9,20,null,null,15,7] ,

3

/ \

9 20

/ \

15 7

返回其自底向上的层次遍历为:

  1. [
  2. [15,7],
  3. [9,20],
  4. [3]
  5. ]

解法一:BFS(广度优先遍历)

BFS 是按层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这题用 BFS 来做非常合适。BFS 需要用队列作为辅助结构,我们先将根节点放到队列中,然后不断遍历队列。

  1. constlevelOrderBottom=function(root){
  2. if(!root)return[]
  3. letres=[],
  4. queue=[root]
  5. while(queue.length){
  6. letcurr=[],
  7. temp=[]
  8. while(queue.length){
  9. letnode=queue.shift()
  10. curr.push(node.val)
  11. if(node.left)temp.push(node.left)
  12. if(node.right)temp.push(node.right)
  13. }
  14. res.push(curr)
  15. queue=temp
  16. }
  17. returnres.reverse()
  18. };

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

解法二:DFS(深度优先遍历)

DFS 是沿着树的深度遍历树的节点,尽可能深地搜索树的分支

DFS 做本题的主要问题是:DFS 不是按照层次遍历的。为了让递归的过程中同一层的节点放到同一个列表中,在递归时要记录每个节点的深度 depth 。递归到新节点要把该节点放入 depth 对应列表的末尾。

当遍历到一个新的深度 depth ,而最终结果 res 中还没有创建 depth 对应的列表时,应该在 res 中新建一个列表用来保存该 depth 的所有节点。

  1. constlevelOrderBottom=function(root){
  2. constres=[]
  3. vardep=function(node,depth){
  4. if(!node)return
  5. res[depth]=res[depth]||[]
  6. res[depth].push(node.val)
  7. dep(node.left,depth+1)
  8. dep(node.right,depth+1)
  9. }
  10. dep(root,0)
  11. returnres.reverse()
  12. };

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(h),h为树的高度

原文链接:https://mp.weixin.qq.com/s/gfvV_MFbHT9bX_DTobnEbg

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部