# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
# 思路是中序遍历,然后返回数组中第k个元素
def myfunc(root,res):
if not root:
return None
myfunc(root.left,res)
res.append(root.val)
myfunc(root.right,res)
res=[]
myfunc(root,res)
return res[k-1]
思路:
- 二叉搜索树变成有序数组
- 返回数组中的k小的元素
优化一下
- 其实不需要数组,直接在递归时计数,就可以返回了
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
# 思路是中序遍历,然后返回数组中第k个元素
def myfunc(root):
if not root:
return None
myfunc(root.left)
# 如果k等于0,后面的递归就没有意义,应return,这是为程序设置的出口
if self.k==0:
return
self.k-=1
if self.k==0:
self.res=root.val
myfunc(root.right)
self.k=k
myfunc(root)
return self.res
解释:
为什么会有self.k=k这一句?
-
在这段代码中,
self.k = k
的作用是为了确保在kthSmallest
方法中的dfs
函数可以访问到正确的k
值。 -
在 Python 类中,
self
关键字用于指代类的实例。当你设置了self.k = k
,意味着你为类的实例添加了一个属性k
,并将其赋值为传入kthSmallest
方法的参数k
的值。 -
在
dfs
函数中,由于 Python 的变量作用域规则,内部函数可以访问外部函数中的变量。然而,如果你尝试直接在dfs
中访问k
,Python 会认为k
是一个局部变量,而不是外部函数中kthSmallest
方法中的参数k
。 -
通过在
kthSmallest
方法中使用self.k = k
,你将k
存储在了类的实例中,因此在dfs
内部可以通过self.k
来访问并修改k
的值。这样做是为了确保在整个类中的不同方法间共享同一个k
值。
或者使用nonlocal关键字:
class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
count = k
def dfs(root):
nonlocal count
if not root or count == 0:
return None
left = dfs(root.left)
if left is not None:
return left
count -= 1
if count == 0:
return root.val
return dfs(root.right)
return dfs(root)
- 这种方法使用 nonlocal 关键字将外部函数的变量 count 标记为在 dfs 函数中可修改的。在 dfs 中修改 count 将会影响到外部函数中的 k。
- 我必须弄清楚python传参到底是怎么样的