绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
LeetCode 102 | 将二叉树中同层的元素归并在一起
2020-08-31 14:03:21

今天是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=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)
            # 将当前元素appendret[d]的list当中
            ret[d].append(u.val)
        dfs(root, )
        return ret

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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

TechFlow
创建时间:2020-03-19 11:13:43
机器学习、算法与数据结构、大数据相关和Python。 从纯基础开始的算法领域入门以及进阶内容。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • chengycz
    栈主

小栈成员

查看更多
  • 兔子爱喝红茶
  • 小雨滴
  • ittttliu
  • 栈栈
戳我,来吐槽~