type BSTree a = BinaryTree a
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
flattenTree :: BinaryTree a -> [a]
flattenTree tree = case tree of
Null -> []
Node left val right -> (flattenTree left) ++ [val] ++ (flattenTree right)
isBSTree :: (Ord a) => BinaryTree a -> Bool
isBSTree btree = case btree of
Null -> False
tree -> (flattenTree tree) == sort (flattenTree tree)
Yang ingin saya lakukan adalah menulis fungsi untuk menentukan apakah pohon yang diberikan adalah pohon pencarian biner, metode saya adalah mengelompokkan semua nilai dalam daftar dan mengimpor Data.List
lalu mengurutkan daftar untuk menemukan apakah mereka sama, tetapi sedikit rumit. Bisakah kita melakukan ini tanpa mengimpor modul lain?
haskell
tree
binary-tree
binary-search-tree
predicate
Jayyyyyy
sumber
sumber
flattenTree
dulu. Anda dapat kembaliFalse
lebih awal jika sebuah simpul melanggar properti pencarian tanpa harus melintasi seluruh subtree yang di-root pada simpul itu.sort
, bukan denganflattenTree
, yang cukup malas.Jawaban:
Inilah cara untuk melakukannya tanpa meratakan pohon.
Dari definisi tersebut, di sini,
orang dapat melihat bahwa melintasi pohon dari kiri ke kanan, mengabaikan
Node
dan tanda kurung, memberi Anda urutanNull
s dana
s yang bergantian . Yaitu, di antara setiap dua nilai, ada aNull
.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-masingNull
. Karena ada diNull
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 danTop
elemen, sebagai berikut:Sekarang mari kita periksa apakah pohon yang diberikan memenuhi persyaratan untuk urutan dan antara batas yang diberikan.
Pohon pencarian biner adalah pohon yang berurutan dan antara
Bot
danTop
.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.
sumber
Inilah sebuah petunjuk: buat fungsi bantu
dimana
BSTResult a
didefinisikan sebagaiAnda harus dapat melanjutkan secara rekursif, mengeksploitasi hasil pada subtree untuk mendorong perhitungan, khususnya minimum dan maksimum.
Misalnya, jika Anda memiliki
tree = Node left 20 right
, denganisBSTree' left = NonEmptyBST 1 14
danisBSTree' right = NonEmptyBST 21 45
, makaisBSTree' tree
seharusnyaNonEmptyBST 1 45
.Dalam kasus yang sama kecuali untuk
tree = Node left 24 right
, kita seharusnya memilikiisBSTree' tree = NotBST
.Mengkonversi hasilnya menjadi
Bool
sepele.sumber
BSTResult a
dan lipat ke dalamnya. :) (atau bahkan jika itu bukan Monoid halal ....)Ya , Anda tidak perlu menyortir daftar. Anda dapat memeriksa apakah setiap elemen kurang dari atau sama dengan elemen berikutnya. Ini lebih efisien karena kita dapat melakukan ini di O (n) , sedangkan mengevaluasi daftar yang diurutkan sepenuhnya membutuhkan O (n log n) .
Dengan demikian kami dapat memeriksa ini dengan:
Jadi kita dapat memeriksa apakah pohon biner adalah pohon pencarian biner dengan:
Saya pikir orang dapat mengklaim bahwa
Null
itu sendiri adalah pohon pencarian biner, karena itu adalah pohon kosong. Ini berarti bahwa untuk setiap node (tidak ada node) elemen-elemen dalam subtree kiri kurang dari atau sama dengan nilai dalam node, dan elemen-elemen dalam subtree kanan semuanya lebih besar dari atau sama dengan nilai pada node .sumber
Kita dapat melanjutkan dari kiri ke kanan di atas pohon seperti ini:
Terinspirasi oleh John McCarthy's
gopher
.Daftar push-down eksplisit dapat dihilangkan dengan kelanjutan-lewat,
Mempertahankan hanya satu, elemen terbesar sejauh ini , sudah cukup.
sumber