【力扣100】230.二叉搜索树中第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,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]

思路:

  1. 二叉搜索树变成有序数组
  2. 返回数组中的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传参到底是怎么样的

你可能感兴趣的:(leetcode,算法)