力扣每日一题:102.二叉树的层序遍历 深度优先与广度优先双解!

102.二叉树的层序遍历

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/102er-cha-shu-de-ceng-xu-bian-li-shen-du-oqy7/

难度:中等

题目:

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:

示例:
二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层序遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

分析

BFS 解题分析

对于二叉树的层序遍历,一般都是使用BFS配合队列完成解题。

  1. 使用队列保存每层的所有节点(初始先入队根节点)
  2. 每次讲队列中的元素循环出队,获取该元素对应的val值
  3. 再把每个元素的非空左右子节点进入队列
  4. 循环2、3,即可得到每层的遍历。

DFS 解题分析

二叉树的前、中、后 顺序遍历,一般最简单的是使用深度优先,但层序遍历也可以通过DFS来解题。

麻烦一些的就是我们需要在DFS层级遍历的时候,根据当前深度进行保存,这里由于返回列表,所以
使用defaultdict来构造特殊的Hash表更为快捷。由于字典的key值为深度,是存在默认排序的,
所以递归返程回放回即可。

下面来分别看看一下两种解题...

解题1 广度优先算法:

from collections import deque

class Solution:
    def levelOrder(self, root):
        ret = []
        queue = deque([root])
        while queue:
            tmp = []
            for i in range(len(queue)):
                point = queue.popleft()
                if point:
                    tmp.append(point.val)
                    queue.append(point.left)
                    queue.append(point.right)
            if tmp:
                ret.append(tmp) 
        return ret

解题2 深度优先算法:

from collections import defaultdict

class Solution:
    def levelOrder(self, root):
        ret = defaultdict(list)

        def dfs(base, level):
            nonlocal ret
            if base:
                ret[level].append(base.val)
                dfs(base.left, level + 1)
                dfs(base.right, level + 1)

        dfs(root, 0)
        return list(ret.values())

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown

你可能感兴趣的:(算法之美,二叉树,队列,python,dfs,算法)