LeetCode 515. Find Largest Value in Each Tree Row

瞳人


发布于 March 1, 2017, 8:30 p.m.

0 个评论

Algorithm LeetCode


原题

You need to find the largest value in each row of a binary tree.

即,找出树的每一层中间的最大值。

Example:

1
2
3
4
5
6
7
Input: 
          1
         / \
        3   2
       / \   \  
      5   3   9
Output: [1, 3, 9]

解法

我一开始写了个非递归的 BFS 算法,用一个特殊的 sep 来分隔各行,以便来计算各行的最大值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def largestValues(self, root):
    """
    :type root: TreeNode
    :rtype: List[int]
    """
    if root is None:
        return []
    # Use a special node to separate rows
    sep = TreeNode(-1)
    queue = [sep, root]
    results = []
    row = -1
    while len(queue) > 1:
        node = queue[0]
        if node is sep:
            # Come to a new row
            row += 1
            # Children of last row have been enqueued,
            # so we mark next row's end
            queue.append(sep)
            del queue[0]
            node = queue[0]
            results.append(node.val)
        else:
            results[row] = max(node.val, results[row])
        # Enqueue children if it has
        if node.left is not None:
            queue.append(node.left)
        if node.right is not None:
            queue.append(node.right)
        del queue[0]

    return results

然后看见了讨论区的基于递归的算法,答案来自 zhongyuan9817 。其中增加一个调用参数,来记录访问结点的层数,以便与相同层数的结点比较。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def largestValues(self, root):
    self.res = []
    self.helper(root, 0)
    return self.res

def helper(self, root, level):
    if not root: return
    if level >= len(self.res):
        self.res += [root.val]
    else:
        self.res[level] = max(root.val, self.res[level])
    self.helper(root.left, level + 1)
    self.helper(root.right, level + 1)

讨论区中,看见了让我觉得叹为观止的代码,来自于 StefanPochmann

1
2
3
4
5
6
7
def largestValues(self, root):
    maxes = []
    row = [root]
    while any(row):
        maxes.append(max(node.val for node in row))
        row = [kid for node in row for kid in (node.left, node.right) if kid]
    return maxes

其中值得学习的是 Python 中 list 映射(list comprehensions)中两个 for 的使用,max参数中的生成器操作,以及 any 的使用。关于这个两个 for 循环的解释,可以参考 YJL1228 的解释。

1
2
3
4
5
6
7
row = [a,b,c,d...]
xxx = []
for node in row:
    for kid in (node.left, node.right):
        if kid:
            xxx += kid,
row = xxx

哎呦, 不错哦!

0 Comments


Leave a Comment:

博客搜索

友情链接

公告

本博客代码已经公布在 Github 上,欢迎交流指正。

QQ 邮箱对 mailgun 不太友好, 所以使用 QQ 邮箱的评论, 可能会无法及时收到邮件。我会尽快寻找其他解决方案的。

本人现在独自使用 linode vps, 20 美元/月, 感觉压力大, 如果有意一起合租, 可以联系我. 在我的任意一篇文章下面留言即可. 关于使用方式, 现在倾向于使用 docker.