İşte ağacı düzleştirmeden yapmanın bir yolu.
Tanımdan, burada,
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
ağacı soldan sağa çevirmenin, görmezden gelmenin Node
ve parantezlerin size alternatif bir Null
s ve a
s dizisi sağladığını görebilirsiniz . Yani, her iki değer arasında bir Null
.
Planım her alt ağaç tatmin uygun olduğunu kontrol etmektir gereksinimleri : Biz yapabilirsiniz rafine her birinde gereklerini Node
biz arasındadır değerleri hatırlayarak, daha sonra test etmek her onları Null
. Null
Sırayla her bir değer çifti arasında bir tane olduğu için , tüm sıralı (soldan sağa) çiftlerin azalmadığını test ettik.
Gereklilik nedir? Bu bir var gevşek alt ve üst ağacında değerlere bağlı. En soldaki ve en sağdaki uçlar da dahil olmak üzere gereksinimleri ifade etmek için Bot
tom ve Top
elemanları ile herhangi bir siparişi aşağıdaki gibi uzatabiliriz :
data TopBot a = Bot | Val a | Top deriving (Show, Eq, Ord)
Şimdi belirli bir ağacın hem sırayla hem de verilen sınırlar arasında olma gereksinimlerini karşıladığını kontrol edelim.
ordBetween :: Ord a => TopBot a -> TopBot a -> BinaryTree a -> Bool
-- tighten the demanded bounds, left and right of any Node
ordBetween lo hi (Node l x r) = ordBetween lo (Val x) l && ordBetween (Val x) hi r
-- check that the demanded bounds are in order when we reach Null
ordBetween lo hi Null = lo <= hi
Bir ikili arama ağacı sırayla ve aralarında bir ağaçtır Bot
ve Top
.
isBSTree :: Ord a => BinaryTree a -> Bool
isBSTree = ordBetween Bot Top
Her alt ağaçtaki gerçek uç değerlerin hesaplanması , dışa doğru köpürtülmesi, ihtiyacınız olandan daha fazla bilgi verir ve sol veya sağ alt ağacın boş olduğu uç durumlarda hareketsizdir. İhtiyaçları korumak ve kontrol etmek, içe doğru itmek, daha homojendir.
flattenTree
İlk olarak tanımlamazdım .False
Bir düğüm, o düğümdeki köklü tüm alt ağacı geçmeden arama özelliğini ihlal ederse erken dönebilirsiniz .