İş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 Nodeve parantezlerin size alternatif bir Nulls ve as 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 Nodebiz arasındadır değerleri hatırlayarak, daha sonra test etmek her onları Null. NullSı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 Bottom ve Topelemanları 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 Botve 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 .FalseBir düğüm, o düğümdeki köklü tüm alt ağacı geçmeden arama özelliğini ihlal ederse erken dönebilirsiniz .