Böyle şeylerde, geriye doğru düşünmek genellikle daha kolaydır, bu yüzden önce neye ihtiyacınız olduğunu düşünün. Açıklamanızdan, bunları listeleyelim:
- özyineleme
- Geçerlilik
- Komple düğüm sayısı
Tamam, bu oldukça kısa bir liste, bu yönetilebilir olmalı. Boş bir yöntemle başlayalım ve ne olması gerektiğinin açıklamasını ekleyeceğim.
valid_bst () {
}
Şimdi geçerlilik. Geçerliliği nasıl kontrol edersiniz? Sohbette bir ağacın geçerli olduğunu söylediniz "eğer ... soldaki tüm çocuklar ebeveynlerinden küçük ve sağ çocuklar ebeveynlerinden büyükse." Eminim siz de eşitliğe izin verdiniz. Bu olurdu t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
Peki ya çocuklardan biri eksikse? Söylediklerinizden biri, eğer biri eksikse (ya da her ikisi de), düğümün hala geçerli olduğunu bildiğinize inanıyorum. Bunu biraz yeniden yapılandırarak ekleyelim:
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
}
Tamam, şimdi bu düğümün geçerli olup olmadığını biliyoruz. Tüm ağacın geçerli olup olmadığını nasıl kontrol edebiliriz? Bir dizide değil, bu yüzden muhtemelen doğrusal olarak döngü yapmak istemiyoruz / istemiyoruz. Ödeviniz cevabı veriyor: özyineleme. Fakat özyineleme kullanarak nasıl bir cevap biriktirebiliriz? Bu düğümün geçerli olup olmadığı ve sol ve sağ düğümlerin geçerli olup olmadığını soran çağrıların sonucu olarak üç bilgiye erişebiliriz. Açıkçası, ağaç sadece bu üçünün hepsi doğru olduğunda geçerlidir.
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
Is the left child valid?
Is the right child valid?
This tree is only valid if this node and both its children are.
}
Eğer dikkat ediyorsanız, bu bize fonksiyonumuzun neye geri dönmesi gerektiğini bile söyler.
Şimdi saymayı nasıl entegre ederiz? Neyin önemli olduğunu söylüyorsunuz ("hem sol hem de sağ alt düğümleri olan bir üst düğüm") ve bunun gerçek koda çevrilmesi zor olmamalı. Bu koşulun karşılanıp karşılanmadığını kontrol edin ve sayacı uygun şekilde artırın. Sadece bunun her doğru olduğunda ulaşılacağı bir yerde olması gerektiğini unutmayın.
Ve tabii ki özyineleme durdurma koşulu ve null olup olmadığını denetleme gibi bazı ayrıntıları dışarıda bıraktım.
<
düğümlerde nasıl tanımlanır?