zoukankan      html  css  js  c++  java
  • 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')了,又了解了一个新内容,嘿嘿。

  • 相关阅读:
    What is Continuous Integration?
    10 Essential TypeScript Tips And Tricks For Angular Devs
    javascript 的事件绑定和取消事件
    Directive Controller And Link Timing In AngularJS
    做事情的态度——做精做细
    How to simplify a PHP code with the help of the façade pattern?
    Can we say objects have attributes, states and behaviors?
    represent states with objects
    【转】一次是不算数的
    nyoj27-水池数目 (求连通块数目)【dfs】
  • 原文地址:https://www.cnblogs.com/qiaojushuang/p/7699801.html
Copyright © 2011-2022 走看看