0Pricing
Coding Interview Prep · Ders

BST’yi ve Orta Sıralı Özellikleri Doğrulama

Ağaç boyunca aktarılan minimum/maksimum sınırları kullanarak bir ikili ağacı BST olarak doğrulayın; ayrıca orta sıralı dolaşımın sıralı bir dizi oluşturduğunu denetleyin.

BST’yi ve Orta Sıralı Özellikleri Doğrulama, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

BST'yi Doğrulama Problemi

BST'yi Doğrulama (LeetCode #98), birçok adayı zorlayan klasik bir mülakat sorusudur. Basit yaklaşım, yalnızca her düğümün değerinin sol çocuğundan büyük ve sağ çocuğundan küçük olduğunu kontrol eder; ancak bu yerel kontrol yetersizdir. Bir alt ağaçtaki düğüm yerel kurala uyduğu hâlde genel BST özelliğini ihlal edebilir. Doğru çözüm, geçerli minimum/maksimum sınırlarını ağaç boyunca aşağıya aktarır.

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# Why local check fails:
#     5
#    / \
#   1   4
#      / \
#     3   6
# Node 4's children (3, 6) satisfy local rule,
# but 4 < 5 and is in the RIGHT subtree -- BST violated!
print('Local check is insufficient -- use min/max bounds')

Minimum/Maksimum Sınırları Yaklaşımı

Alt ve üst sınırları özyineleme boyunca aktarın. Her düğümde low < node.val < high koşulunu doğrulayın. Sola özyinelemeli çağrı yaparken üst sınırı node.val olarak güncelleyin (sol alt ağaç daha küçük olmalıdır). Sağa özyinelemeli çağrı yaparken alt sınırı node.val olarak güncelleyin (sağ alt ağaç daha büyük olmalıdır). low = -infinity ve high = +infinity ile başlayın.

def is_valid_bst(root, low=float('-inf'), high=float('inf')):
    if not root:
        return True
    if not (low < root.val < high):
        return False
    return (is_valid_bst(root.left, low, root.val) and
            is_valid_bst(root.right, root.val, high))

# Valid BST:
valid = TreeNode(5)
valid.left = TreeNode(3)
valid.right = TreeNode(7)
print(is_valid_bst(valid))  # True

# Invalid BST (3 is in wrong subtree conceptually):
invalid = TreeNode(5)
invalid.left = TreeNode(1)
invalid.right = TreeNode(4)
invalid.right.left = TreeNode(3)
invalid.right.right = TreeNode(6)
print(is_valid_bst(invalid))  # False (4 < 5 in right subtree)

Sıralı Dolaşım ile Doğrulama

Alternatif bir doğrulama yaklaşımı, BST'nin sıralı olma özelliğini kullanır: sıralı diziyi toplayın ve kesin olarak artan bir dizi olduğunu doğrulayın. Bu yaklaşım zarif ve anlaşılması kolaydır. Ancak diziyi saklamak için O(n) ek alan kullanır. İyileştirilmiş bir sürüm, dizinin tamamını saklamadan her çifti kontrol etmek için dolaşım sırasında tek bir prev göstericisi kullanır.

def is_valid_bst_inorder(root):
    prev = [float('-inf')]

    def inorder(node):
        if not node:
            return True
        if not inorder(node.left):
            return False
        if node.val <= prev[0]:  # not strictly increasing
            return False
        prev[0] = node.val
        return inorder(node.right)

    return inorder(root)

valid = TreeNode(5)
valid.left = TreeNode(3)
valid.right = TreeNode(7)
valid.left.left = TreeNode(1)
valid.left.right = TreeNode(4)
print(is_valid_bst_inorder(valid))   # True

invalid = TreeNode(5)
invalid.left = TreeNode(6)  # 6 > 5 in left subtree!
print(is_valid_bst_inorder(invalid)) # False

Her İki Doğrulama Yaklaşımını Karşılaştırma

Minimum/maksimum sınırları yaklaşımı O(n) zamanda ve O(h) alanda çalışır (yalnızca çağrı yığınındaki sınırlar). Sıralı dolaşımda prev göstericisi yaklaşımı da O(n) zamanda ve O(h) alanda çalışır. Her iki yaklaşım da en iyi asimptotik karmaşıklığa sahiptir. Minimum/maksimum yaklaşımı daha geneldir ve ek kısıtları olan problemlere genişletildiğinde temiz biçimde çalışır. Mülakatlarda her ikisini de sunmaya ve ödünleşimleri tartışmaya hazır olun; alternatiflerin farkında olduğunuzu göstermek güçlü bir işarettir.

# Both approaches:
# Time: O(n) -- visit each node once
# Space: O(h) -- call stack depth
# h = O(log n) balanced, O(n) skewed

# When to choose which:
# min/max bounds:
#   - Cleaner for trees with constraints beyond BST
#   - No global state (purely functional)
# in-order prev:
#   - More intuitive (sorted sequence check)
#   - Easier to convert to iterative with a stack

print('Both O(n) time, O(h) space -- choose by clarity')

BST'yi Kurtarma: Yer Değiştirilmiş İki Düğüm

BST'yi Kurtarma (LeetCode #99), tam olarak iki düğümün yer değiştirdiği bir BST'yi düzeltir. Sıralı dolaşım sırasında doğru sıradaki bir BST, sıralı bir dizi üretir. İki düğüm yer değiştirmişse prev.val > current.val koşulunun gerçekleştiği bir veya iki ihlal bulunur. İlk ihlalin ilk düğümü ile son ihlalin ikinci düğümü, yeri değiştirilmiş iki düğümdür; değerlerini yer değiştirin.

def recover_tree(root):
    first = second = prev = None

    def inorder(node):
        nonlocal first, second, prev
        if not node:
            return
        inorder(node.left)
        if prev and prev.val > node.val:
            if not first:
                first = prev    # first violator
            second = node       # always update second
        prev = node
        inorder(node.right)

    inorder(root)
    # Swap values of the two misplaced nodes
    if first and second:
        first.val, second.val = second.val, first.val

root = TreeNode(3)
root.left = TreeNode(1)
root.right = TreeNode(4)
root.right.left = TreeNode(2)  # 2 and 3 are swapped
recover_tree(root)
print(root.val, root.right.left.val)  # 2, 3 (fixed)

BST'den Sıralı Diziye

Bir BST'yi sıralı diziye dönüştürmek basittir: sıralı dolaşımı gerçekleştirin ve değerleri toplayın. O(n) zaman ve O(n) alan kullanan bu işlem, BST verileri üzerinde sıralı dizi algoritmalarından (ikili arama, iki gösterici) yararlanmanın hızlı bir yoludur. Genellikle “iki BST'yi birleştirme” veya “BST'nin medyanını bulma” gibi çok aşamalı BST problemlerinde bir başlangıç adımıdır.

def bst_to_sorted_array(root):
    result = []
    def inorder(node):
        if not node:
            return
        inorder(node.left)
        result.append(node.val)
        inorder(node.right)
    inorder(root)
    return result

root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(6)
root.left.left = TreeNode(1)
root.left.right = TreeNode(3)
root.right.left = TreeNode(5)
root.right.right = TreeNode(7)
print(bst_to_sorted_array(root))  # [1, 2, 3, 4, 5, 6, 7]

İki BST'yi Birleştirme

İki BST'yi birleştirerek tek bir sıralı dizi elde etmek için her birini O(n) ve O(m) zamanda sıralı diziye dönüştürün, ardından iki sıralı diziyi birleştirmeli sıralamanın birleştirme adımını kullanarak O(n+m) zamanda birleştirin. Toplam zaman: O(n+m). Sonucu dengeli bir BST olarak istiyorsanız birleştirilmiş sıralı diziyi sıralı diziden BST oluşturma algoritmasına verin. Bu ayrıştırma işlemiyle basit alt problemlere bölmek, anlaşılır ve mülakatlarda sunulabilir bir çözümün göstergesidir.

def merge_two_bsts(root1, root2):
    def inorder(node, arr):
        if not node:
            return
        inorder(node.left, arr)
        arr.append(node.val)
        inorder(node.right, arr)

    arr1, arr2 = [], []
    inorder(root1, arr1)
    inorder(root2, arr2)

    # Merge two sorted arrays
    merged = []
    i = j = 0
    while i < len(arr1) and j < len(arr2):
        if arr1[i] <= arr2[j]:
            merged.append(arr1[i]); i += 1
        else:
            merged.append(arr2[j]); j += 1
    merged.extend(arr1[i:])
    merged.extend(arr2[j:])
    return merged

r1 = TreeNode(2); r1.left = TreeNode(1); r1.right = TreeNode(4)
r2 = TreeNode(3); r2.left = TreeNode(0); r2.right = TreeNode(5)
print(merge_two_bsts(r1, r2))  # [0, 1, 2, 3, 4, 5]

BST Aralığındaki Düğümleri Sayma

Değerleri [low, high] aralığında olan düğümlerin sayısını bulun. Kaba kuvvetli sıralı dolaşım taraması O(n) zamanda çalışır. BST özelliklerinden yararlanan sürüm ise dalları budar: mevcut düğümün değeri low'dan küçükse sol alt ağacı kontrol etmenin anlamı yoktur (oradaki tüm değerler de low'dan küçüktür). Benzer şekilde, mevcut değer high'dan büyük olduğunda sağ alt ağacı budayın. Ortalama durum O(log n + k)'dir; burada k, eşleşen düğümlerin sayısıdır.

def range_sum_bst(root, low, high):
    if not root:
        return 0
    total = 0
    if low <= root.val <= high:
        total += root.val
    if root.val > low:   # left subtree may have values >= low
        total += range_sum_bst(root.left, low, high)
    if root.val < high:  # right subtree may have values <= high
        total += range_sum_bst(root.right, low, high)
    return total

root = TreeNode(10)
root.left = TreeNode(5)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(7)
root.right.right = TreeNode(18)
print(range_sum_bst(root, 7, 15))  # 7 + 10 + 15 = 32

Yinelenen Değerler ve Sıkı ile Sıkı Olmayan BST

Standart BST değişmezi sıkı eşitsizlik kullanır: sol alt ağaç değerleri kesinlikle daha küçük, sağ alt ağaç değerleri ise kesinlikle daha büyüktür. Bazı problemler yinelenen değerlere izin verir ve bunları sol alt ağaca (left <= root) veya sağ alt ağaca (root < right) yerleştirir. BST'leri doğrularken problem açıklamasındaki tanımı her zaman kontrol edin. Minimum/maksimum sınırları yaklaşımı, sınır kontrolünün sıkı mı yoksa kapsayıcı mı olduğunu ayarlayarak her iki çeşidi de ele alır.

# Strict BST (LeetCode default): left < root < right
def is_valid_strict(root, lo=float('-inf'), hi=float('inf')):
    if not root:
        return True
    if not (lo < root.val < hi):  # STRICT inequalities
        return False
    return (is_valid_strict(root.left, lo, root.val) and
            is_valid_strict(root.right, root.val, hi))

# Non-strict BST (allows duplicates in right): left <= root < right
def is_valid_nonstrict(root, lo=float('-inf'), hi=float('inf')):
    if not root:
        return True
    if not (lo <= root.val < hi):  # NOTE: <= for left side
        return False
    return (is_valid_nonstrict(root.left, lo, root.val + 1) and
            is_valid_nonstrict(root.right, root.val, hi))

print('Always clarify strict vs non-strict with interviewer')

Evrensel BST Aracı Olarak Sıralı Dolaşım

Sıralı dolaşım, BST problemlerinin İsviçre çakısıdır. Bir BST problemi sıralı düzen, k'ıncı eleman, aralık sorguları veya dizi özellikleri hakkında soru sorduğunda, sıralı bir taramanın (veya tersinin) yanıtı verip vermeyeceğini düşünün. BST'ye özgü problemlerin çoğu şu kalıba indirgenir: sıralı düzende dolaşın ve her adımda bir işlem yapın. Bu eşlemeyi hızlıca fark etmek önemli bir mülakat becerisidir.

# Problems solved elegantly with in-order:
# 1. Validate BST: check prev <= curr during in-order
# 2. Kth smallest: count k steps in in-order
# 3. Kth largest: count k steps in REVERSE in-order
# 4. Closest value to target: find crossover in in-order
# 5. BST to sorted array: collect in-order into list
# 6. Recover BST: find 1-2 violations in in-order
# 7. Sum of range [lo, hi]: accumulate during in-order

# The key insight: in-order visits BST nodes in sorted order.
# All sorted-order reasoning translates to in-order DFS.
print('In-order = sorted access = foundation of BST reasoning')

BST'de En Yakın Değer

Belirli bir hedefe en yakın değere sahip düğümü bulun. BST'nin sıralama özelliğini kullanın: kökten başlayın, şimdiye kadar görülen en yakın değeri izleyin ve hedefe doğru ilerleyin (hedef daha küçükse sola, daha büyükse sağa gidin). Bu O(h) yaklaşımı, sıralı bir taramadan daha verimlidir ve arama alanını budamak için BST özelliğinin etkili kullanımını gösterir.

def closest_value(root, target):
    closest = root.val
    curr = root
    while curr:
        if abs(curr.val - target) < abs(closest - target):
            closest = curr.val
        if target < curr.val:
            curr = curr.left
        elif target > curr.val:
            curr = curr.right
        else:
            break  # exact match
    return closest

root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(1)
root.left.right = TreeNode(3)
print(closest_value(root, 3.714286))  # 4

Hızlı Kontrol

Bu dersteki Veri Yapıları ve Algoritmalar — Kodlama Mülakatı Hazırlığı kavramlarını anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: minimum/maksimum sınırlarıyla BST doğrulama (yerel kontrol tuzağından kaçınma), doğrulama için sıralı dolaşımda prev göstericisi alternatifi ve aralık toplamları, en yakın değer ve birleştirme işlemleri için evrensel BST aracı olarak sıralı dolaşım. Sırada, k'ıncı en küçük elemanı bulmak için BST'nin sıralı dolaşım özelliklerini kullanmak var.

Sıkça Sorulan Sorular

“BST’yi ve Orta Sıralı Özellikleri Doğrulama” dersi ücretsiz mi?

Evet — “BST’yi ve Orta Sıralı Özellikleri Doğrulama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“BST’yi ve Orta Sıralı Özellikleri Doğrulama” dersinde ne öğreneceğim?

Ağaç boyunca aktarılan minimum/maksimum sınırları kullanarak bir ikili ağacı BST olarak doğrulayın; ayrıca orta sıralı dolaşımın sıralı bir dizi oluşturduğunu denetleyin. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“BST’yi ve Orta Sıralı Özellikleri Doğrulama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. BST Ekleme ve Arama
  2. BST Silme: Üç Durum
  3. BST’yi ve Orta Sıralı Özellikleri Doğrulama
  4. K’inci En Küçük, Aralık Toplamı ve BST’den Sıralı Diziye
← Coding Interview Prep Sayfasına Dön