Inilah cara untuk melakukannya tanpa meratakan pohon.
Dari definisi tersebut, di sini,
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
orang dapat melihat bahwa melintasi pohon dari kiri ke kanan, mengabaikan Node
dan tanda kurung, memberi Anda urutan Null
s dan a
s yang bergantian . Yaitu, di antara setiap dua nilai, ada a Null
.
Rencana saya adalah untuk memeriksa bahwa setiap subtree memenuhi persyaratan yang sesuai : kita dapat memperbaiki persyaratan di masing-masing Node
, mengingat nilai-nilai mana kita berada, kemudian mengujinya di masing-masing Null
. Karena ada di Null
antara setiap pasangan nilai yang berurutan, kami akan menguji bahwa semua pasangan berurutan (kiri-ke-kanan) tidak menurun.
Apa itu persyaratan? Ini adalah batas bawah dan atas longgar pada nilai-nilai di pohon. Untuk menyatakan persyaratan, termasuk yang di ujung paling kiri dan paling kanan, kami dapat memperpanjang pemesanan dengan Bot
tom dan Top
elemen, sebagai berikut:
data TopBot a = Bot | Val a | Top deriving (Show, Eq, Ord)
Sekarang mari kita periksa apakah pohon yang diberikan memenuhi persyaratan untuk urutan dan antara batas yang diberikan.
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
Pohon pencarian biner adalah pohon yang berurutan dan antara Bot
dan Top
.
isBSTree :: Ord a => BinaryTree a -> Bool
isBSTree = ordBetween Bot Top
Menghitung nilai - nilai ekstrem aktual dalam setiap subtree, menggelembungkannya keluar, memberi Anda lebih banyak informasi daripada yang Anda butuhkan, dan secara fiddly dalam kasus tepi di mana subtree kiri atau kanan kosong. Mempertahankan dan memeriksa persyaratan , mendorongnya ke dalam, agak lebih seragam.
flattenTree
dulu. Anda dapat kembaliFalse
lebih awal jika sebuah simpul melanggar properti pencarian tanpa harus melintasi seluruh subtree yang di-root pada simpul itu.