• [Swift]LeetCode230. 二叉搜索树中第K小的元素 | Kth Smallest Element in a BST


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10204792.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

    Note: 
    You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

    Example 1:

    Input: root = [3,1,4,null,2], k = 1
       3
      / 
     1   4
      
       2
    Output: 1

    Example 2:

    Input: root = [5,3,6,2,4,null,null,1], k = 3
           5
          / 
         3   6
        / 
       2   4
      /
     1
    Output: 3
    

    Follow up:
    What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?


    给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

    说明:
    你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

    示例 1:

    输入: root = [3,1,4,null,2], k = 1
       3
      / 
     1   4
      
       2
    输出: 1

    示例 2:

    输入: root = [5,3,6,2,4,null,null,1], k = 3
           5
          / 
         3   6
        / 
       2   4
      /
     1
    输出: 3

    进阶:
    如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?


    56ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         func TreeSize(_ root: TreeNode?) -> Int {
    17             if root == nil {
    18                 return 0
    19             }
    20             return 1 + TreeSize(root?.left) + TreeSize(root?.right)
    21         }
    22         if root == nil {
    23             return 0
    24         }
    25         var leftSize = TreeSize(root?.left)
    26         if leftSize + 1 == k {
    27             return root!.val
    28         } else if leftSize >= k {
    29             return kthSmallest(root?.left, k)
    30         } else if leftSize + 1 < k {
    31             return kthSmallest(root?.right, k - leftSize - 1)
    32         }  
    33         return 0
    34     }
    35 }

    64ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         var allNode = [Int]()
    17         findAllNode(root, &allNode)
    18         allNode.sort { (a, b) -> Bool in
    19             a < b
    20         }
    21         return allNode[k - 1];
    22     }
    23     func findAllNode(_ node: TreeNode?, _ allNode: inout [Int]) -> Void {
    24         if node == nil {
    25             return
    26         }
    27         allNode.append(node!.val);
    28         findAllNode(node!.left, &allNode)
    29         findAllNode(node!.right, &allNode)
    30     }
    31 }

    68ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         var i = 1
    17         var result = 0
    18         inorderTraversal(root: root) { val in
    19             if i == k {
    20                 result = val
    21             }
    22             i += 1
    23         }
    24         return result
    25     }
    26     
    27     private func inorderTraversal(root: TreeNode?, handler: (Int) -> Void) {
    28         guard let root = root else { return }
    29         inorderTraversal(root: root.left, handler: handler)
    30         handler(root.val)
    31         inorderTraversal(root: root.right, handler: handler)
    32     }
    33 }

    72ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         var k2 = k
    17         var result = 0
    18         kthSmallest(root, k, &k2, &result)
    19         return result
    20     }
    21 
    22     func kthSmallest(_ root: TreeNode?, _ k: Int, _ k2: inout Int, _ result: inout Int) {
    23         guard let root = root else {
    24             return
    25         }
    26 
    27         if k2 == 0 {
    28             return
    29         }
    30 
    31         kthSmallest(root.left, k, &k2, &result)
    32 
    33         if k2 == 1 {
    34             k2 = 0
    35             result = root.val
    36         }
    37         k2 -= 1
    38         kthSmallest(root.right, k, &k2, &result)
    39     }
    40 }

    80ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         var count = 0
    17         return traverseTree(root, k, &count)
    18     }
    19     
    20     func traverseTree(_ root: TreeNode?, _ k: Int, _ count : inout Int) -> Int {
    21         var output = -1;
    22         if let left = root?.left {
    23             output = traverseTree(left, k, &count)
    24         }
    25         
    26         if output != -1 {
    27             return output;
    28         }
    29         
    30         count += 1        
    31         if count == k {
    32             return root!.val
    33         }
    34         
    35         if let right = root?.right {
    36             output = traverseTree(right, k, &count)
    37         }
    38         
    39         return output
    40     }
    41 }

    84ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     
    16     
    17     var res = 0
    18     var maxLength = 0
    19     
    20     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    21         
    22         maxLength = k
    23         helper(node: root)
    24         return res
    25     }
    26     
    27     func helper(node: TreeNode?) {
    28         guard let node = node else {
    29             return
    30         }
    31         
    32         helper(node: node.left)
    33         maxLength -= 1
    34         if maxLength == 0 {
    35             res = node.val
    36             return
    37         }
    38         helper(node: node.right)
    39     }
    40 }

    88ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         var stack = [TreeNode]()
    17         var valueArray = [Int]()
    18         var root = root
    19         
    20         while !stack.isEmpty || root != nil {
    21             while root != nil {
    22                 stack.append(root!)
    23                 root = root?.left
    24             }
    25             let curr = stack.removeLast()
    26             valueArray.append(curr.val)
    27             root = curr.right
    28         }
    29         
    30         return valueArray[k - 1]
    31     }
    32 }

    92ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16     guard let root = root else {
    17         return -1
    18     }
    19     
    20     var stack = [TreeNode]()
    21     var curr: TreeNode? = root
    22     var k = k
    23     
    24     while curr != nil || !stack.isEmpty {
    25         if curr != nil {
    26             stack.append(curr!)
    27             curr = curr?.left
    28         } else {
    29             let node = stack.popLast()
    30             k -= 1
    31             
    32             if k == 0 {
    33                 return node!.val
    34             }
    35             
    36             curr = node?.right
    37         }
    38     }
    39       return -1
    40     }
    41 }

    96ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         let (_, result) = helper(root, k)
    17         
    18         return result ?? 0
    19     }
    20     
    21     func helper(_ root: TreeNode?, _ k: Int) -> (Int, Int?) {
    22         guard let root = root else { return (0, nil) }
    23         
    24         let (countL, vL) = helper(root.left, k)
    25         if vL != nil {
    26             return (countL, vL)
    27         } else if countL == k - 1 {
    28             return (k, root.val)
    29         } else {
    30             let (countR, vR) = helper(root.right, k - countL - 1)
    31             if vR != nil {
    32                 return (k, vR)
    33             } else {
    34                 return (countL + countR + 1, nil)
    35             }
    36         }
    37         
    38     }
    39 }

    96ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     
    16     class Queue<T> {
    17   
    18   private var array:[T]?
    19   
    20   func isEmpty() -> Bool {
    21     
    22     guard array != nil && array!.count != 0 else {
    23       
    24       return true
    25     }
    26     
    27     return false
    28   }
    29   
    30   func inQueue(_ val:T) {
    31     
    32     if array == nil {
    33       
    34       array = Array()
    35     }
    36     
    37     array?.insert(val, at: 0)
    38   }
    39   
    40   func outQueue() -> T? {
    41     
    42     return array?.popLast()
    43   }
    44 }
    45 
    46       func inorder(_ root:TreeNode?, _ queue:Queue<Int>) -> Void {
    47     
    48     if root == nil {
    49       
    50       return
    51     }
    52     
    53     inorder(root?.left, queue)
    54     
    55     queue.inQueue(root!.val)
    56     
    57     inorder(root?.right, queue)
    58   }
    59 
    60    func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    61    
    62     guard root != nil else {
    63       
    64       return 0
    65     }
    66     
    67     let queue = Queue<Int>()
    68     
    69     inorder(root, queue)
    70     
    71     var i = k
    72     
    73     while i > 1 {
    74       
    75       queue.outQueue()
    76       
    77       i -= 1
    78     }
    79     
    80     return queue.outQueue()!
    81   }
    82 }

    100ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         guard let root = root else {
    17             return 0
    18         }
    19         
    20         var nodes: [TreeNode] = []
    21         var node: TreeNode? = root
    22         var index = 0
    23         while !nodes.isEmpty || node != nil {
    24             if node != nil {
    25                 nodes.append(node!)
    26                 node = node?.left
    27             } else if let lastNode = nodes.popLast() {
    28                 index += 1
    29                 if index == k {
    30                     return lastNode.val
    31                 }
    32                 node = lastNode.right
    33             }
    34         }
    35         
    36         return 0
    37     }
    38 }

    140ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func kthSmallest(_ root: TreeNode?, _ k: Int) -> Int {
    16         var count = 1
    17         var result = 0
    18         travesal(root, &count, &result, k)
    19         return result
    20     }
    21     
    22     func travesal(_ node: TreeNode?, _ index: inout Int, _ result: inout Int, _ k: Int) {
    23         if node != nil && index <= k{
    24             travesal(node!.left, &index, &result, k)
    25             if index == k {
    26                 result = node!.val
    27             }
    28             index += 1
    29             travesal(node!.right, &index, &result, k)
    30         }
    31     }
    32 }
  • 相关阅读:
    zombie处理
    exec
    fork
    udp program
    PS中进程状态
    关闭socket连接最好的方法
    setsockopt
    【Python】Webpy 源码学习
    web.py 安装
    WSGI、flup、fastcgi、web.py的关系
  • 原文地址:https://www.cnblogs.com/strengthen/p/10204792.html
Copyright © 2020-2023  润新知