【Leetcode】python - [230] Kth Smallest Element in a BST 個人解法筆記

題目出處

230. Kth Smallest Element in a BST

難度

medium

個人範例程式碼 - recursive 版本

# 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:
        self.k = k
        self.final_ans = -1
        self.dfs(root)

        return self.final_ans

    def dfs(self, root):
        if not root:
            return 

        self.dfs(root.left)
        self.k -= 1
        if self.k == 0:
            self.final_ans = root.val
        self.dfs(root.right)

        return

算法說明

建立一個 global 的計數器 (這設計可能不太好),然後照 BST 的概念下去找第 K 小的值。

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

input handling

找不到對應結果時,回傳 -1 (題目沒有要求這部份)

Boundary conditions

x

個人範例程式碼 - iterative 版本

# 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:
        self.stack = deque()
        self.to_left_bottom(root)

        while(k > 0):
            cur = node = self.stack[-1]
            if node.right is not None:
                node = node.right
                self.to_left_bottom(node)
            else:
                node = self.stack.pop()
                while self.stack and self.stack[-1].right == node:
                    node = self.stack.pop()

            k -= 1 # get one node
            if k == 0:
                return cur.val
        else:
            return -1

    def to_left_bottom(self, node):
        while(node):
            self.stack.append(node)
            node = node.left

算法說明

iterative 的解法,我們借用 Binary Search Tree Iterator 的概念來使用,可參考:

https://wongwongnotes-github-io.pages.dev/python/leetcode-python-173/

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

input handling

找不到對應結果時,回傳 -1 (題目沒有要求這部份)

Boundary conditions

x

Reference

Licensed under CC BY-NC-SA 4.0