メインコンテンツへスキップ

NeetCode 150 [Trees]medium:Kth Smallest Element In a Bst

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

NeetCodeのSolutionを書いていく
#

Kth Smallest Element In a Bst
#

問題
#

2分木のルートがと整数kが与えられます。k番目に小さい値を返しなさい。 左の木はノードのKeyより小さいKeyのノードしか含みません。 右の木はノードのKeyより大きいKeyのノードしか含みません。

#

Input: root = [2,1,3], k = 1 Output: 1

Input: root = [4,3,5,2,null], k = 4 Output: 5

制約
#

  • 1 <= k <= The number of nodes in the tree <= 1000.
  • 0 <= Node.val <= 1000
  • 計算量:O(n)
  • メモリ:O(n)

メモ
#

  • 小さい順に並べた時のK番目がほしい
  • 左から順に調査すれば良い
  • 再帰的に調査し、まずは一番左のノードを調査
  • node.leftがNoneならば1を返す
  • 次に右を調査、上記返却値を合わせて番目の数字を返すようにする
  • 番目がKになった時のnode.valを返す うむ、どうしても複雑になってしまう。

答えを見ると、以下で行けるらしい

  1. ノードをスタックしながら左に向かって調査
  2. 左のターゲットがなくなったらスタックポップ+カウントアップ
  3. この時点でカウントがkならvalを返す
  4. そうではない場合は右の枝に現在地を移して エレガント!
from typing import Optional


# 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:
        n = 0
        stack: list[TreeNode] = []
        cur = root

        while cur or stack:
            while cur:
                stack.append(cur)
                cur = cur.left

            cur = stack.pop()
            assert cur is not None

            n += 1
            if n == k:
                return cur.val
            cur = cur.right

        return n
Reply by Email

関連記事

NeetCode 150 [Trees]medium:Validate Binary Search Tree
· loading · loading
NeetCode 150 [Trees]medium:Count Good Nodes In Binary Tree
· loading · loading
NeetCode 150 [Trees]medium:Binary Tree Right Side View
· loading · loading