Python 解LeetCode:671. Second Minimum Node In a Binary Tree

      题目在这里,要求一个二叉树的倒数第二个小的值。二叉树的特点是父节点的值会小于子节点的值,父节点要么没有子节点,要不左右孩子节点都有。

    分析一下,根据定义,跟节点的值肯定是二叉树中最小的值,剩下的只需要找到左右子树中比跟节点大的最小值就可以了。对于这个题目,还是考察的二叉树的搜索,第一印象是BFS。使用一个辅助队列存储遍历过程中的节点,遍历过程中,如果节点的值比结果中第二小的值还大,就不用继续把该节点及其所有的子节点入队了,这样可以节省时间。这里的辅助队列使用的是deque,在两端存取数据的复杂度都是O(1),List取出第一个元素的复杂度是O(n)。代码如下:

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.left = None
 6 #         self.right = None
 7 
 8 class Solution(object):
 9     def findSecondMinimumValue(self, root):
10         """
11         :type root: TreeNode
12         :rtype: int
13         """
14         from collections import deque
15         if not root:
16             return -1
17         stack = deque([root])
18         ret = [root.val]
19         while stack:
20             node = stack.popleft()
21             if node:
22                 if node.val > ret[-1]:
23                     if len(ret) < 2:
24                         ret.append(node.val)
25                 else:
26                     if ret[0] < node.val < ret[1]:
27                         ret[1] = node.val
28                     stack.append(node.left)
29                     stack.append(node.right)
30         return ret[1] if len(ret) == 2 else -1

 

        每次做完都要去讨论区看看有没有亮瞎眼的解法,把DFS的代码贴在下面,思路是一样的,不过看着更简洁了:

 1 class Solution(object):
 2     def findSecondMinimumValue(self, root):
 3         """
 4         :type root: TreeNode
 5         :rtype: int
 6         """
 7         # Time: O(n)
 8         # Space: O(lgn)
 9         res = [float('inf')]
10         def traverse(node):
11             if not node:
12                 return
13             if root.val < node.val < res[0]:
14                 res[0] = node.val
15             traverse(node.left)
16             traverse(node.right)
17         traverse(root)
18         return -1 if res[0] == float('inf') else res[0]

        这里需要说一下代码中的float('inf'),以前倒是真没用到这里,这是Python中代表正无穷的写法,负无穷就是float('-inf')了,又了解了一个新内容,嘿嘿。

posted @ 2017-10-20 15:36  潇湘旧友  阅读(410)  评论(0编辑  收藏  举报