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')了,又了解了一个新内容,嘿嘿。