LeetCode 102 | 将二叉树中同层的元素归并在一起

时间:2022-07-24
本文章向大家介绍LeetCode 102 | 将二叉树中同层的元素归并在一起,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天是LeetCode专题第65篇文章,我们一起来聊聊LeetCode第102题Binary Tree Level Order Traversal(二叉树层次归类)。

题目简介

这道题的官方难度是Medium,我个人认为算是Medium-。点赞3324,反对只有79,好评如潮。通过率54.8%,通过率在Medium当中算是偏高的。

考察的要点主要在对二叉树和DFS(递归、深搜)的理解和运用,如果对于二叉树以及递归非常熟悉的话,这道题几乎没有难度。题目非常扎实,没有trick和陷阱。

题意

给定一个二叉树,要求我们将树上的元素根据所在的树深进行归类。也可以理解成横向的遍历这棵树,最后返回归类的结果。

这样描述有些干,我们来结合样例看下。

    3
   / 
  9  20
    /  
   15   7

这棵二叉树,树深为0的点就只有一个3,所以这一层的元素是[3],树深为1的点有两个,分别是9和20。由于题目当中规定了从左往右遍历,所以结果是[9, 20]。第三层也很明显了,是[15, 7]。所以最终返回的结果就是:

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

题解

我们仔细来分析一下问题,可以发现本题的关键点有两个,一个是我们要按照树深来将这些元素归类。第二点是我们要保证元素按照从左到右的顺序存储

第一个问题相对简单,我们只需要在使用dfs递归遍历树的时候传入一个树深的变量就可以了。这个也是常规操作,没有什么难度。所以稍微剩下的就是保证元素从左到右的顺序存储了,但稍微想一下就可以发现这其实也并不是什么问题。因为无论是先序、中序还是后序遍历,对于同一层的元素来说,一定是先左后右的。所以这并不是问题,我们只需要通过树深进行归类就可以了,得到的结果一定是满足题意的。

我们来看下代码就明白了,非常简单:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        ret = []
        def dfs(u, d):
            if u is None:
                return
            # 如果树深超过了ret的长度,那么末尾加入一个空的list
            if d >= len(ret):
                ret.append([])
            # 这里采取的是后序遍历二叉树,其实是一样的
            # 递归孩子节点的时候d+1,也就是树深增加了1
            dfs(u.left, d+1)
            dfs(u.right, d+1)
            # 将当前元素append到ret[d]的list当中
            ret[d].append(u.val)
        dfs(root, 0)
        return ret

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、在看、点赞)。 - END -