Given the root of a binary tree, determine if it is a valid binary search tree (BST).
A valid BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
Both the left and right subtrees must also be binary search trees.
Örnek 1
Input: root = [2,1,3]
Output: true
Örnek 2
Input: root = [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.
Çözüm
Bir binary tree (ikili ağaç) veriliyor, bu ağacın geçerli bir Binary Search Tree (BST) olup olmadığını kontrol edeceğiz.
BST Nedir?Her bir node (düğüm) için:
Sol alt ağaçtaki tüm değerler: node.val’den küçük olmalı
Sağ alt ağaçtaki tüm değerler: node.val’den büyük olmalı
Bu kural tüm alt ağaçlar için geçerli olmalı, sadece direkt çocuklar için değil.
inorder Traversal ile BST Kontrolü
Eğer bir ağaç geçerli bir BST ise, inorder traversal sonucu artan sırada olur.
Yani:Sol alt ağaç → Kök → Sağ alt ağaç şeklinde gezeriz.
Her adımda bir önceki düğümün değerini saklarız (prev).
Eğer şu anki düğümün değeri prev’den küçük veya eşit olursa, kural bozulmuştur → Geçerli BST değildir.
Neden Inorder Traversal Kullanılır?BST’lerde inorder traversal sonucu sıralı olur.
Bu yüzden tek bir değişken (prev) ile kontrol etmek mümkündür.
Fazladan veri yapısı kullanmadan, çok sade bir şekilde kontrol yapılır.
Code
classSolution:defisValidBST(self,root):self.prev=None# Önceki düğüm değerini saklamak içindefinorder(node):ifnotnode:returnTrue# 1. Sol alt ağacı kontrol etifnotinorder(node.left):returnFalse# 2. Şu anki düğüm BST kuralını bozuyor mu?ifself.previsnotNoneandnode.val<=self.prev:returnFalse# Sıra bozuldu: geçerli BST değilself.prev=node.val# Güncel değeri sakla# 3. Sağ alt ağacı kontrol etreturninorder(node.right)returninorder(root)
Complexity
Time complexity (Zaman Karmaşıklığı): O(N) → Her düğüm bir kez ziyaret edilir
Space complexity (Alan Karmaşıklığı): O(H) → H = ağacın yüksekliği (recursive stack)