給定一個二叉搜索樹,編寫一個函數 kthSmallest
來查找其中第 k 個最小的元素。 你能夠假設 k 老是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。node
中序遍歷,利用Python3中提供的生成器方法;web
中序遍歷,判斷存儲結點值的數組是否到到k,則代表訪問的一個結點就是第k個最小的元素;數組
先獲取跟結點處於的位置(第幾個最小的元素),若是它比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