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 DSA 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, DSA Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DSA 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)) # FalseHer İ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 = 32Yinelenen 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)) # 4Hı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 DSA Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DSA 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. DSA 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.
DSA Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DSA 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 DSA Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DSA 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
- BST Ekleme ve Arama
- BST Silme: Üç Durum
- BST’yi ve Orta Sıralı Özellikleri Doğrulama
- K’inci En Küçük, Aralık Toplamı ve BST’den Sıralı Diziye