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=, 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, )
return ret
今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、在看、点赞)。-
相关文章