230. 二叉搜索樹中第K小的元素

230. 二叉搜索樹中第K小的元素

題意

給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。 你能夠假設 k 老是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。node

解題思路

  1. 中序遍歷,利用Python3中提供的生成器方法;web

  2. 中序遍歷,判斷存儲結點值的數組是否到到k,則代表訪問的一個結點就是第k個最小的元素;數組

  3. 先獲取跟結點處於的位置(第幾個最小的元素),若是它比k小,則從右子結點中找,若是它比k大,則從左子節點中找;app

實現

class Solution:
   def kthSmallest(self, root: TreeNode, k: int) -> int:
     """
    利用了Python3中新增的生成器方法;
    """
       def gen(r):
           if r is not None:
               yield from gen(r.left)
               yield r.val
               yield from gen(r.right)
       
       it = gen(root)
       for _ in range(k):
           ans = next(it)
       return ans
     
def kthSmallest(self, root, k):
       """
      中序遍歷,判斷當前訪問的結點是不是第k個最小的個數;
      :type root: TreeNode
      :type k: int
      :rtype: int
      """
       stack = []
       def helper(node):
           if not node:
               return
           helper(node.left)
           if len(stack) == k:
               return;
           stack.append(node.val)
           helper(node.right)
       
       if not root:
           return None

       helper(root)
       return stack[-1]

def kthSmallest(self, root, k):
       """
      :type root: TreeNode
      :type k: int
      :rtype: int
      """
       def helper(node):
           if not node:
               return 0
           # 獲取以node爲跟結點的結點總個數
           return helper(node.left) + helper(node.right) + 1
       
       if not root:
           return None

       while True:
           # number表示當前結點是第n小的元素
           number = helper(root.left) + 1
           
           # 每次判斷當前結點處在第幾小的位置
           # 若是比k大,說明值的範圍比當前結點要小,則繼續從當前結點的左子結點中找;
           # 若是比k小,說明值的範圍比當前結點要大,則繼續從當前結點的右子結點中找;
           if number < k:
               root = root.right
               k -= number
           elif number > k:
               root = root.left
           else:
               return root.val
       
       return 0
相關文章
相關標籤/搜索