import Data.List
-- Implementations for exercises 2.1, 2.4 and 2.5
data Tree a
= Empty
| Node a
(Tree a
) (Tree a
) deriving (Show)
-- Ex 2.1
recreateTree
:: (Ord a
, Eq a
) => [a
] -> [a
] -> Tree a
recreateTree [] [] = Empty
recreateTree inord postord = Node root left right
where root
= last postord
left = recreateTree leftInord leftPostord
right = recreateTree rightInord rightPostord
Just rootInd = elemIndex root inord
leftInord
= take rootInd inord
rightInord
= drop (rootInd
+1) inord
leftPostord
= take rootInd postord
rightPostord
= init $ drop rootInd postord
-- Ex 2.4
buildBST
:: (Ord a
, Eq a
) => [a
] -> Tree a
buildBST [] = Empty
buildBST xs = Node root left right
where (root,len) = middle xs
left
= buildBST
$ take len xs
right
= buildBST
$ drop (len
+1) xs
middle xs = (xs !! half, half)
-- Ex 2.5
printLevelK tree k = go tree k
where go Empty _ = "Nil"
go
(Node a l r
) 0 = show a
go (Node a l r) k = go l (k-1) ++ " " ++ go r (k-1)
-- Tests
ino = [4,2,5,1,3,6]
posto = [4,5,2,6,3,1]
bst20 = buildBST [1..20]
putStrLn "\nRecreating tree from inorder and postorder:"
--we can use printLevelK as a crappy prettyprinter :-D
--test with the previous tree:
putStrLn "\nPrint recreated tree level by level:" let tree = recreateTree ino posto
height Empty = -1
height
(Node
_ l r
) = 1 + max (height l
) (height r
)
aW1wb3J0IERhdGEuTGlzdAppbXBvcnQgQ29udHJvbC5Nb25hZAoKLS0gSW1wbGVtZW50YXRpb25zIGZvciBleGVyY2lzZXMgMi4xLCAyLjQgYW5kIDIuNQoKZGF0YSBUcmVlIGEgPSBFbXB0eSB8IE5vZGUgYSAoVHJlZSBhKSAoVHJlZSBhKSBkZXJpdmluZyAoU2hvdykKCi0tIEV4IDIuMQpyZWNyZWF0ZVRyZWUgOjogKE9yZCBhLCBFcSBhKSA9PiAgW2FdIC0+IFthXSAtPiBUcmVlIGEKcmVjcmVhdGVUcmVlIFtdICAgIFtdICAgICAgPSBFbXB0eQpyZWNyZWF0ZVRyZWUgaW5vcmQgcG9zdG9yZCA9IE5vZGUgcm9vdCBsZWZ0IHJpZ2h0CiAgd2hlcmUgcm9vdCAgPSBsYXN0IHBvc3RvcmQKICAgICAgICBsZWZ0ICA9IHJlY3JlYXRlVHJlZSBsZWZ0SW5vcmQgbGVmdFBvc3RvcmQKICAgICAgICByaWdodCA9IHJlY3JlYXRlVHJlZSByaWdodElub3JkIHJpZ2h0UG9zdG9yZCAgCgogICAgICAgIEp1c3Qgcm9vdEluZCA9IGVsZW1JbmRleCByb290IGlub3JkCiAgICAgICAgbGVmdElub3JkICAgID0gdGFrZSByb290SW5kIGlub3JkCiAgICAgICAgcmlnaHRJbm9yZCAgID0gZHJvcCAocm9vdEluZCsxKSBpbm9yZAoKICAgICAgICBsZWZ0UG9zdG9yZCAgPSB0YWtlIHJvb3RJbmQgcG9zdG9yZAogICAgICAgIHJpZ2h0UG9zdG9yZCA9IGluaXQgJCBkcm9wIHJvb3RJbmQgcG9zdG9yZAoKCi0tIEV4IDIuNApidWlsZEJTVCA6OiAoT3JkIGEsIEVxIGEpID0+IFthXSAtPiBUcmVlIGEKYnVpbGRCU1QgW10gPSBFbXB0eQpidWlsZEJTVCB4cyA9IE5vZGUgcm9vdCBsZWZ0IHJpZ2h0CiAgd2hlcmUgKHJvb3QsbGVuKSA9IG1pZGRsZSB4cwogICAgICAgIGxlZnQgICAgICAgPSBidWlsZEJTVCAkIHRha2UgbGVuIHhzCiAgICAgICAgcmlnaHQgICAgICA9IGJ1aWxkQlNUICQgZHJvcCAobGVuKzEpIHhzCiAgICAgICAgCm1pZGRsZSA6OiBbYV0gLT4gKGEsSW50KQptaWRkbGUgW10gPSBlcnJvciAiRDoiCm1pZGRsZSB4cyA9ICh4cyAhISBoYWxmLCBoYWxmKQogIHdoZXJlIGhhbGYgPSAobGVuZ3RoIHhzKSBgZGl2YCAyCgoKLS0gRXggMi41CnByaW50TGV2ZWxLIDo6IChTaG93IGEpID0+IFRyZWUgYSAtPiBJbnRlZ2VyIC0+IFN0cmluZwpwcmludExldmVsSyB0cmVlIGsgPSBnbyB0cmVlIGsKICB3aGVyZSBnbyBFbXB0eSAgICAgICAgXyA9ICJOaWwiCiAgICAgICAgZ28gKE5vZGUgYSBsIHIpIDAgPSBzaG93IGEKICAgICAgICBnbyAoTm9kZSBhIGwgcikgayA9IGdvIGwgKGstMSkgKysgIiAgIiArKyBnbyByIChrLTEpCgoKLS0gVGVzdHMKCmlubyA9IFs0LDIsNSwxLDMsNl0KcG9zdG8gPSBbNCw1LDIsNiwzLDFdCgpic3QyMCA9IGJ1aWxkQlNUIFsxLi4yMF0KCm1haW4gPSBkbyBwdXRTdHJMbiAiVHJlZSB0ZXN0cyEiCiAgICAgICAgICBwdXRTdHJMbiAiLS0tLS0tLS0tLS0iCiAgICAgICAgICBwdXRTdHJMbiAiXG5SZWNyZWF0aW5nIHRyZWUgZnJvbSBpbm9yZGVyIGFuZCBwb3N0b3JkZXI6IgogICAgICAgICAgcHV0U3RyTG4gJCAiaW5vcmRlcjogICAiICsrIHNob3cgaW5vCiAgICAgICAgICBwdXRTdHJMbiAkICJwb3N0b3JkZXI6ICIgKysgc2hvdyBwb3N0bwogICAgICAgICAgcHV0U3RyTG4gJCAidHJlZTogICAgICAiICsrIHNob3cgKHJlY3JlYXRlVHJlZSBpbm8gcG9zdG8pCgogICAgICAgICAgcHV0U3RyTG4gIlxuUHJpbnQgZWFjaCBsZXZlbCBvZiBic3QyMDoiCiAgICAgICAgICBwdXRTdHJMbiAiLS0tLS0tLS0tLS0iCiAgICAgICAgICBtYXBNXyAocHV0U3RyTG4gLiBwcmludExldmVsSyBic3QyMCkgWzAuLmhlaWdodCBic3QyMF0KCgogICAgICAgICAgLS13ZSBjYW4gdXNlIHByaW50TGV2ZWxLIGFzIGEgY3JhcHB5IHByZXR0eXByaW50ZXIgOi1ECiAgICAgICAgICAtLXRlc3Qgd2l0aCB0aGUgcHJldmlvdXMgdHJlZToKICAgICAgICAgIHB1dFN0ckxuICJcblByaW50IHJlY3JlYXRlZCB0cmVlIGxldmVsIGJ5IGxldmVsOiIKICAgICAgICAgIHB1dFN0ckxuICItLS0tLS0tLS0tLSIKICAgICAgICAgIGxldCB0cmVlID0gcmVjcmVhdGVUcmVlIGlubyBwb3N0bwogICAgICAgICAgbWFwTV8gKHB1dFN0ckxuIC4gcHJpbnRMZXZlbEsgdHJlZSkgWzAuLmhlaWdodCB0cmVlXQoKaGVpZ2h0IDo6IFRyZWUgYSAtPiBJbnRlZ2VyCmhlaWdodCBFbXB0eSAgICAgICAgPSAtMQpoZWlnaHQgKE5vZGUgXyBsIHIpID0gMSArIG1heCAoaGVpZ2h0IGwpIChoZWlnaHQgcik=
Tree tests!
-----------
Recreating tree from inorder and postorder:
inorder: [4,2,5,1,3,6]
postorder: [4,5,2,6,3,1]
tree: Node 1 (Node 2 (Node 4 Empty Empty) (Node 5 Empty Empty)) (Node 3 Empty (Node 6 Empty Empty))
Print each level of bst20:
-----------
11
6 16
3 9 14 19
2 5 8 10 13 15 18 20
1 Nil 4 Nil 7 Nil Nil Nil 12 Nil Nil Nil 17 Nil Nil Nil
Print recreated tree level by level:
-----------
1
2 3
4 5 Nil 6