Programming in Haskell: Lecture 22
Transcript of Programming in Haskell: Lecture 22
![Page 1: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/1.jpg)
Programming in Haskell: Lecture 22
S P Suresh
October 30, 2019
Suresh PRGH 2019: Lecture 22 October 30, 2019 1 / 31
![Page 2: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/2.jpg)
Binary trees
• A binary tree data structure is defined as follows:
• The empty tree is a binary tree• A node containing an element with left and right subtrees is a binarytree• Type constructor BTree
data BTree a = Nil| Node (BTree a) a (BTree a)
• Two value constructors:Nil :: BTree aNode :: BTree a -> a -> BTree a -> BTree a
Suresh PRGH 2019: Lecture 22 October 30, 2019 2 / 31
![Page 3: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/3.jpg)
Binary trees
• A binary tree data structure is defined as follows:• The empty tree is a binary tree
• A node containing an element with left and right subtrees is a binarytree• Type constructor BTree
data BTree a = Nil| Node (BTree a) a (BTree a)
• Two value constructors:Nil :: BTree aNode :: BTree a -> a -> BTree a -> BTree a
Suresh PRGH 2019: Lecture 22 October 30, 2019 2 / 31
![Page 4: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/4.jpg)
Binary trees
• A binary tree data structure is defined as follows:• The empty tree is a binary tree• A node containing an element with left and right subtrees is a binarytree
• Type constructor BTreedata BTree a = Nil
| Node (BTree a) a (BTree a)
• Two value constructors:Nil :: BTree aNode :: BTree a -> a -> BTree a -> BTree a
Suresh PRGH 2019: Lecture 22 October 30, 2019 2 / 31
![Page 5: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/5.jpg)
Binary trees
• A binary tree data structure is defined as follows:• The empty tree is a binary tree• A node containing an element with left and right subtrees is a binarytree• Type constructor BTree
data BTree a = Nil| Node (BTree a) a (BTree a)
• Two value constructors:Nil :: BTree aNode :: BTree a -> a -> BTree a -> BTree a
Suresh PRGH 2019: Lecture 22 October 30, 2019 2 / 31
![Page 6: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/6.jpg)
Binary trees
• A binary tree data structure is defined as follows:• The empty tree is a binary tree• A node containing an element with left and right subtrees is a binarytree• Type constructor BTree
data BTree a = Nil| Node (BTree a) a (BTree a)
• Two value constructors:Nil :: BTree aNode :: BTree a -> a -> BTree a -> BTree a
Suresh PRGH 2019: Lecture 22 October 30, 2019 2 / 31
![Page 7: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/7.jpg)
Binary trees
Node (Node Nil 4 Nil) 6(Node (Node Nil 2 Nil) 3
(Node Nil 5 Nil))
6
4 3
2 5
Suresh PRGH 2019: Lecture 22 October 30, 2019 3 / 31
![Page 8: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/8.jpg)
Binary trees
• Yet another binary tree3
1
2
5
4
• Corresponding BTreeNode
(Node Nil 1 (Node Nil 2 Nil))3
(Node (Node Nil 4 Nil) 5 Nil)
Suresh PRGH 2019: Lecture 22 October 30, 2019 4 / 31
![Page 9: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/9.jpg)
Binary trees
• Yet another binary tree3
1
2
5
4
• Corresponding BTreeNode
(Node Nil 1 (Node Nil 2 Nil))3
(Node (Node Nil 4 Nil) 5 Nil)
Suresh PRGH 2019: Lecture 22 October 30, 2019 4 / 31
![Page 10: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/10.jpg)
Functions on binary trees
• Number of nodes in a treesize :: BTree a -> Intsize Nil = 0size (Node tl x tr) = 1 + size tl + size tr
• Height: number of nodes on longest path from rootheight :: BTree a -> Intheight Nil = 0height (Node tl x tr) = 1 + max (height tl) (height tr)
Suresh PRGH 2019: Lecture 22 October 30, 2019 5 / 31
![Page 11: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/11.jpg)
Functions on binary trees
• Number of nodes in a treesize :: BTree a -> Intsize Nil = 0size (Node tl x tr) = 1 + size tl + size tr
• Height: number of nodes on longest path from rootheight :: BTree a -> Intheight Nil = 0height (Node tl x tr) = 1 + max (height tl) (height tr)
Suresh PRGH 2019: Lecture 22 October 30, 2019 5 / 31
![Page 12: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/12.jpg)
Creating a binary tree
• Create a binary tree from a list
• As balanced as possible• Strategy:
• Split the list in two halves• Recursively create a binary tree from each half• Join them together
Suresh PRGH 2019: Lecture 22 October 30, 2019 6 / 31
![Page 13: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/13.jpg)
Creating a binary tree
• Create a binary tree from a list• As balanced as possible
• Strategy:
• Split the list in two halves• Recursively create a binary tree from each half• Join them together
Suresh PRGH 2019: Lecture 22 October 30, 2019 6 / 31
![Page 14: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/14.jpg)
Creating a binary tree
• Create a binary tree from a list• As balanced as possible• Strategy:
• Split the list in two halves• Recursively create a binary tree from each half• Join them together
Suresh PRGH 2019: Lecture 22 October 30, 2019 6 / 31
![Page 15: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/15.jpg)
Creating a binary tree
• Create a binary tree from a list• As balanced as possible• Strategy:• Split the list in two halves
• Recursively create a binary tree from each half• Join them together
Suresh PRGH 2019: Lecture 22 October 30, 2019 6 / 31
![Page 16: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/16.jpg)
Creating a binary tree
• Create a binary tree from a list• As balanced as possible• Strategy:• Split the list in two halves• Recursively create a binary tree from each half
• Join them together
Suresh PRGH 2019: Lecture 22 October 30, 2019 6 / 31
![Page 17: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/17.jpg)
Creating a binary tree
• Create a binary tree from a list• As balanced as possible• Strategy:• Split the list in two halves• Recursively create a binary tree from each half• Join them together
Suresh PRGH 2019: Lecture 22 October 30, 2019 6 / 31
![Page 18: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/18.jpg)
Creating a binary tree
• Creating a balanced tree from a listcreateTree :: [a] -> BTree acreateTree [] = NilcreateTree xs = Node
(createTree front) x (createTree back)where
n = length xs(front, x:back) = splitAt (n `div` 2) xs
Suresh PRGH 2019: Lecture 22 October 30, 2019 7 / 31
![Page 19: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/19.jpg)
Showing a binary tree
• To be able to show a binary tree, we need to derive a Show instancedata BTree a = Nil | Node (BTree a) a (BTree a)
deriving Show
createTree [0..14] =Node (Node (Node (Node Nil 0 Nil) 1 (Node Nil 2 Nil))
3 (Node (Node Nil 4 Nil) 5 (Node Nil 6 Nil)))7 (Node (Node (Node Nil 8 Nil) 9 (Node Nil 10 Nil))
11 (Node (Node Nil 12 Nil) 13 (Node Nil 14 Nil)))
• Not particularly readable!
Suresh PRGH 2019: Lecture 22 October 30, 2019 8 / 31
![Page 20: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/20.jpg)
Showing a binary tree
• To be able to show a binary tree, we need to derive a Show instancedata BTree a = Nil | Node (BTree a) a (BTree a)
deriving Show
createTree [0..14] =Node (Node (Node (Node Nil 0 Nil) 1 (Node Nil 2 Nil))
3 (Node (Node Nil 4 Nil) 5 (Node Nil 6 Nil)))7 (Node (Node (Node Nil 8 Nil) 9 (Node Nil 10 Nil))
11 (Node (Node Nil 12 Nil) 13 (Node Nil 14 Nil)))
• Not particularly readable!
Suresh PRGH 2019: Lecture 22 October 30, 2019 8 / 31
![Page 21: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/21.jpg)
A custom show
4
2
1
0
3
6
5 7
42
10*
36
57
Suresh PRGH 2019: Lecture 22 October 30, 2019 9 / 31
![Page 22: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/22.jpg)
A custom show
4
2
0
1
3
6
5
7
42
0*1
36
5*7
*
Suresh PRGH 2019: Lecture 22 October 30, 2019 10 / 31
![Page 23: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/23.jpg)
A custom show
instance Show a => Show (BTree a) whereshow = intercalate "\n" (draw t)
draw :: Show a => BTree a -> [String]draw Nil = ["*"]draw (Node Nil x Nil) = [show x]draw (Node tl x tr) = [show x] ++
shift (draw tl) ++shift (draw tr)
where shift = zipWith (++) (repeat " ")
Suresh PRGH 2019: Lecture 22 October 30, 2019 11 / 31
![Page 24: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/24.jpg)
A custom show
0
1
2
3
4 5
0|+-1| || +-*| || `-2|`-3
|+-4|`-5
Suresh PRGH 2019: Lecture 22 October 30, 2019 12 / 31
![Page 25: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/25.jpg)
A custom show
instance Show a => Show (BTree a) whereshow = intercalate "\n" (draw2 t)
draw2 :: Show a => BTree a -> [String]draw2 Nil = ["*"]draw2 (Node Nil x Nil) = [show x]draw2 (Node tl x tr) = [show x] ++
shiftl (draw2 tl) ++shiftr (draw2 tr)
where shiftl = zipWith (++) ("+-":repeat "| ")shiftr = zipWith (++) ("`-":repeat " ")
Suresh PRGH 2019: Lecture 22 October 30, 2019 13 / 31
![Page 26: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/26.jpg)
Creating a binary tree
• Creating a balanced tree from a listcreateTree :: [a] -> BTree acreateTree [] = NilcreateTree xs = Node
(createTree front) x (createTree back)where
n = length xs(front, x:back) = splitAt (n `div` 2) xs
Suresh PRGH 2019: Lecture 22 October 30, 2019 14 / 31
![Page 27: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/27.jpg)
Creating a binary tree
• length and splitAt take linear time
• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?
• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 28: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/28.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)
• Can we improve?
• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 29: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/29.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?
• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 30: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/30.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?• Culprit is the repeated use of length and splitAt
• Can we avoid that?• Consider the following function:
go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 31: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/31.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 32: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/32.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 33: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/33.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 34: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/34.jpg)
Creating a binary tree
• length and splitAt take linear time• T (n) = 2T (n/2)+O(n) and hence T (n) =O(n log n)• Can we improve?• Culprit is the repeated use of length and splitAt• Can we avoid that?
• Consider the following function:go :: Int -> [a] -> (BTree a, [a])
• go n l == (createTree (take n l), drop n l)
• Can we do this efficiently?
Suresh PRGH 2019: Lecture 22 October 30, 2019 15 / 31
![Page 35: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/35.jpg)
Creating a binary tree
• Creating a tree in linear timecreateTree :: [a] -> BTree acreateTree l = fst (go (length l) l)
wherego :: Int -> [a] -> (BTree a, [a])go 0 xs = (Nil, xs)go n xs = (Node tl y tr, zs)
where m = n `div` 2(tl, y:ys) = go m xs(tr, zs) = go (n-m-1) ys
• T (n) = 2T (n/2)+ c and hence T (n) = (2n− 1)c
Suresh PRGH 2019: Lecture 22 October 30, 2019 16 / 31
![Page 36: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/36.jpg)
Creating a binary tree
• Creating a tree in linear timecreateTree :: [a] -> BTree acreateTree l = fst (go (length l) l)
wherego :: Int -> [a] -> (BTree a, [a])go 0 xs = (Nil, xs)go n xs = (Node tl y tr, zs)
where m = n `div` 2(tl, y:ys) = go m xs(tr, zs) = go (n-m-1) ys
• T (n) = 2T (n/2)+ c and hence T (n) = (2n− 1)c
Suresh PRGH 2019: Lecture 22 October 30, 2019 16 / 31
![Page 37: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/37.jpg)
The Set ADT
• Maintain a collection of distinct elements and support the followingoperations
• insertInto – insert a given value into the set• deleteFrom – delete a given value from the set• search – check whether a given value is an element of the set
• Straightforward implementationmodule Set(Set, insertInto, deleteFrom, search) wheredata Set a = Set [a]
Suresh PRGH 2019: Lecture 22 October 30, 2019 17 / 31
![Page 38: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/38.jpg)
The Set ADT
• Maintain a collection of distinct elements and support the followingoperations• insertInto – insert a given value into the set
• deleteFrom – delete a given value from the set• search – check whether a given value is an element of the set
• Straightforward implementationmodule Set(Set, insertInto, deleteFrom, search) wheredata Set a = Set [a]
Suresh PRGH 2019: Lecture 22 October 30, 2019 17 / 31
![Page 39: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/39.jpg)
The Set ADT
• Maintain a collection of distinct elements and support the followingoperations• insertInto – insert a given value into the set• deleteFrom – delete a given value from the set
• search – check whether a given value is an element of the set
• Straightforward implementationmodule Set(Set, insertInto, deleteFrom, search) wheredata Set a = Set [a]
Suresh PRGH 2019: Lecture 22 October 30, 2019 17 / 31
![Page 40: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/40.jpg)
The Set ADT
• Maintain a collection of distinct elements and support the followingoperations• insertInto – insert a given value into the set• deleteFrom – delete a given value from the set• search – check whether a given value is an element of the set
• Straightforward implementationmodule Set(Set, insertInto, deleteFrom, search) wheredata Set a = Set [a]
Suresh PRGH 2019: Lecture 22 October 30, 2019 17 / 31
![Page 41: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/41.jpg)
The Set ADT
• Maintain a collection of distinct elements and support the followingoperations• insertInto – insert a given value into the set• deleteFrom – delete a given value from the set• search – check whether a given value is an element of the set
• Straightforward implementationmodule Set(Set, insertInto, deleteFrom, search) wheredata Set a = Set [a]
Suresh PRGH 2019: Lecture 22 October 30, 2019 17 / 31
![Page 42: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/42.jpg)
The Set ADT
data Set a = Set [a]
search :: Eq a => a -> Set a -> Boolsearch x (Set xs) = x `elem` xs
insertInto :: Eq a => a -> Set a -> Set ainsertInto x (Set xs) = if x `elem` xs then Set xs
else Set (x:xs)
deleteFrom :: Eq a => a -> Set a -> Set adeleteFrom x (Set xs) = Set (filter (/=x) xs)
Suresh PRGH 2019: Lecture 22 October 30, 2019 18 / 31
![Page 43: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/43.jpg)
Set: complexity
• search takesO(n) time
• insertInto takesO(n) time• deleteFrom takesO(n) time• A sequence of n operations takesO(n2) time• We can do better if the elements admit an order
Suresh PRGH 2019: Lecture 22 October 30, 2019 19 / 31
![Page 44: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/44.jpg)
Set: complexity
• search takesO(n) time• insertInto takesO(n) time
• deleteFrom takesO(n) time• A sequence of n operations takesO(n2) time• We can do better if the elements admit an order
Suresh PRGH 2019: Lecture 22 October 30, 2019 19 / 31
![Page 45: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/45.jpg)
Set: complexity
• search takesO(n) time• insertInto takesO(n) time• deleteFrom takesO(n) time
• A sequence of n operations takesO(n2) time• We can do better if the elements admit an order
Suresh PRGH 2019: Lecture 22 October 30, 2019 19 / 31
![Page 46: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/46.jpg)
Set: complexity
• search takesO(n) time• insertInto takesO(n) time• deleteFrom takesO(n) time• A sequence of n operations takesO(n2) time
• We can do better if the elements admit an order
Suresh PRGH 2019: Lecture 22 October 30, 2019 19 / 31
![Page 47: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/47.jpg)
Set: complexity
• search takesO(n) time• insertInto takesO(n) time• deleteFrom takesO(n) time• A sequence of n operations takesO(n2) time• We can do better if the elements admit an order
Suresh PRGH 2019: Lecture 22 October 30, 2019 19 / 31
![Page 48: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/48.jpg)
Binary search trees
• A binary search tree is another way of implementing the Set ADT
• A binary search tree is a binary tree• Stores values of type a such that Ord a• In a binary search tree:
• values in the left subtree are smaller than the root• values in the right subtree are larger than the root
Suresh PRGH 2019: Lecture 22 October 30, 2019 20 / 31
![Page 49: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/49.jpg)
Binary search trees
• A binary search tree is another way of implementing the Set ADT• A binary search tree is a binary tree
• Stores values of type a such that Ord a• In a binary search tree:
• values in the left subtree are smaller than the root• values in the right subtree are larger than the root
Suresh PRGH 2019: Lecture 22 October 30, 2019 20 / 31
![Page 50: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/50.jpg)
Binary search trees
• A binary search tree is another way of implementing the Set ADT• A binary search tree is a binary tree• Stores values of type a such that Ord a
• In a binary search tree:
• values in the left subtree are smaller than the root• values in the right subtree are larger than the root
Suresh PRGH 2019: Lecture 22 October 30, 2019 20 / 31
![Page 51: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/51.jpg)
Binary search trees
• A binary search tree is another way of implementing the Set ADT• A binary search tree is a binary tree• Stores values of type a such that Ord a• In a binary search tree:
• values in the left subtree are smaller than the root• values in the right subtree are larger than the root
Suresh PRGH 2019: Lecture 22 October 30, 2019 20 / 31
![Page 52: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/52.jpg)
Binary search trees
• A binary search tree is another way of implementing the Set ADT• A binary search tree is a binary tree• Stores values of type a such that Ord a• In a binary search tree:• values in the left subtree are smaller than the root
• values in the right subtree are larger than the root
Suresh PRGH 2019: Lecture 22 October 30, 2019 20 / 31
![Page 53: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/53.jpg)
Binary search trees
• A binary search tree is another way of implementing the Set ADT• A binary search tree is a binary tree• Stores values of type a such that Ord a• In a binary search tree:• values in the left subtree are smaller than the root• values in the right subtree are larger than the root
Suresh PRGH 2019: Lecture 22 October 30, 2019 20 / 31
![Page 54: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/54.jpg)
Binary search trees
• The binary search treeNode tl x tr
• Pictorially …x
tl
< x
tr
> x
Suresh PRGH 2019: Lecture 22 October 30, 2019 21 / 31
![Page 55: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/55.jpg)
Binary search trees
• The binary search treeNode tl x tr
• Pictorially …x
tl
< x
tr
> x
Suresh PRGH 2019: Lecture 22 October 30, 2019 21 / 31
![Page 56: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/56.jpg)
Binary search trees
• Examples
3
1
2
5
4 6
4
2
1 3
6
5• Non-examples
3
2
4
6
5
2
0
1
4
3 5Suresh PRGH 2019: Lecture 22 October 30, 2019 22 / 31
![Page 57: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/57.jpg)
BST
• Binary search trees in Haskell:data BST a = Nil | Node (BST a) a (BST a)
deriving (Eq, Ord)
• The empty tree:emptyBST :: BST aemptyBST = Nil
• Is a tree empty?isEmpty :: BST a -> BoolisEmpty Nil = TrueisEmpty _ = False
Suresh PRGH 2019: Lecture 22 October 30, 2019 23 / 31
![Page 58: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/58.jpg)
BST
• Binary search trees in Haskell:data BST a = Nil | Node (BST a) a (BST a)
deriving (Eq, Ord)
• The empty tree:emptyBST :: BST aemptyBST = Nil
• Is a tree empty?isEmpty :: BST a -> BoolisEmpty Nil = TrueisEmpty _ = False
Suresh PRGH 2019: Lecture 22 October 30, 2019 23 / 31
![Page 59: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/59.jpg)
BST
• Binary search trees in Haskell:data BST a = Nil | Node (BST a) a (BST a)
deriving (Eq, Ord)
• The empty tree:emptyBST :: BST aemptyBST = Nil
• Is a tree empty?isEmpty :: BST a -> BoolisEmpty Nil = TrueisEmpty _ = False
Suresh PRGH 2019: Lecture 22 October 30, 2019 23 / 31
![Page 60: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/60.jpg)
Is it a search tree?
• Just naming it BST does not make it a binary search treeisBST :: Ord a => BST a -> BoolisBST Nil = TrueisBST (Node tl x tr) = isBST tl && isBST tr &&
(isEmpty tl || maxt tl < x) &&(isEmpty tr || x < mint tr)
Suresh PRGH 2019: Lecture 22 October 30, 2019 24 / 31
![Page 61: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/61.jpg)
Minimum in a tree
• mint gives the minimum value in a non-empty tree:
mint :: Ord a => BST a -> amint (Node tl x tr) = min x (min y z)where y = if isEmpty tl then x else mint tl
z = if isEmpty tr then x else mint tr
• maxt is similar (uses max instead of min)
Suresh PRGH 2019: Lecture 22 October 30, 2019 25 / 31
![Page 62: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/62.jpg)
Minimum in a tree
• mint gives the minimum value in a non-empty tree:
mint :: Ord a => BST a -> amint (Node tl x tr) = min x (min y z)where y = if isEmpty tl then x else mint tl
z = if isEmpty tr then x else mint tr
• maxt is similar (uses max instead of min)
Suresh PRGH 2019: Lecture 22 October 30, 2019 25 / 31
![Page 63: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/63.jpg)
Searching in a tree
• Searching for value v in a search tree
• If the tree is empty, report False• If the tree is nonempty
• If v is the value at the root, report True• If v is smaller than the value at the root, search in left subtree• If v is larger than the value at the root, search in right subtree
Suresh PRGH 2019: Lecture 22 October 30, 2019 26 / 31
![Page 64: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/64.jpg)
Searching in a tree
• Searching for value v in a search tree• If the tree is empty, report False
• If the tree is nonempty
• If v is the value at the root, report True• If v is smaller than the value at the root, search in left subtree• If v is larger than the value at the root, search in right subtree
Suresh PRGH 2019: Lecture 22 October 30, 2019 26 / 31
![Page 65: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/65.jpg)
Searching in a tree
• Searching for value v in a search tree• If the tree is empty, report False• If the tree is nonempty
• If v is the value at the root, report True• If v is smaller than the value at the root, search in left subtree• If v is larger than the value at the root, search in right subtree
Suresh PRGH 2019: Lecture 22 October 30, 2019 26 / 31
![Page 66: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/66.jpg)
Searching in a tree
• Searching for value v in a search tree• If the tree is empty, report False• If the tree is nonempty• If v is the value at the root, report True
• If v is smaller than the value at the root, search in left subtree• If v is larger than the value at the root, search in right subtree
Suresh PRGH 2019: Lecture 22 October 30, 2019 26 / 31
![Page 67: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/67.jpg)
Searching in a tree
• Searching for value v in a search tree• If the tree is empty, report False• If the tree is nonempty• If v is the value at the root, report True• If v is smaller than the value at the root, search in left subtree
• If v is larger than the value at the root, search in right subtree
Suresh PRGH 2019: Lecture 22 October 30, 2019 26 / 31
![Page 68: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/68.jpg)
Searching in a tree
• Searching for value v in a search tree• If the tree is empty, report False• If the tree is nonempty• If v is the value at the root, report True• If v is smaller than the value at the root, search in left subtree• If v is larger than the value at the root, search in right subtree
Suresh PRGH 2019: Lecture 22 October 30, 2019 26 / 31
![Page 69: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/69.jpg)
Searching in a tree
• Haskell code transcribe the search strategy:searchBST :: Ord a => a -> BST a -> BoolsearchBST v Nil = FalsesearchBST v (Node tl x tr)
| v == x = True| v < x = searchBST v tl| v > x = searchBST v tr
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 27 / 31
![Page 70: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/70.jpg)
Searching in a tree
• Haskell code transcribe the search strategy:searchBST :: Ord a => a -> BST a -> BoolsearchBST v Nil = FalsesearchBST v (Node tl x tr)
| v == x = True| v < x = searchBST v tl| v > x = searchBST v tr
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 27 / 31
![Page 71: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/71.jpg)
Inserting in a tree
• Inserting an element into a tree follows a similar strategy:insertBST :: Ord a => a -> BST a -> BST ainsertBST v Nil = Node Nil v NilinsertBST v t@(Node tl x tr)
| v < x = Node (insertBST v tl) x tr| v > x = Node tl x (insertBST v tr)| v == x = t
• Worst case running time: Height of the tree• @ allows one to refer to a data value by a name
Suresh PRGH 2019: Lecture 22 October 30, 2019 28 / 31
![Page 72: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/72.jpg)
Inserting in a tree
• Inserting an element into a tree follows a similar strategy:insertBST :: Ord a => a -> BST a -> BST ainsertBST v Nil = Node Nil v NilinsertBST v t@(Node tl x tr)
| v < x = Node (insertBST v tl) x tr| v > x = Node tl x (insertBST v tr)| v == x = t
• Worst case running time: Height of the tree
• @ allows one to refer to a data value by a name
Suresh PRGH 2019: Lecture 22 October 30, 2019 28 / 31
![Page 73: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/73.jpg)
Inserting in a tree
• Inserting an element into a tree follows a similar strategy:insertBST :: Ord a => a -> BST a -> BST ainsertBST v Nil = Node Nil v NilinsertBST v t@(Node tl x tr)
| v < x = Node (insertBST v tl) x tr| v > x = Node tl x (insertBST v tr)| v == x = t
• Worst case running time: Height of the tree• @ allows one to refer to a data value by a name
Suresh PRGH 2019: Lecture 22 October 30, 2019 28 / 31
![Page 74: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/74.jpg)
Deleting from a tree
• We first tackle a simpler problem
• Delete the maximum value• and return the value as well as the modified tree
• Maximum is the rightmost node:deleteMax :: Ord a => BST a -> (a, BST a)deleteMax (Node tl x Nil) = (x, tl)deleteMax (Node tl x tr) = let (y, ty) = deleteMax tr
in (y, Node tl x ty)
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 29 / 31
![Page 75: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/75.jpg)
Deleting from a tree
• We first tackle a simpler problem• Delete the maximum value
• and return the value as well as the modified tree• Maximum is the rightmost node:
deleteMax :: Ord a => BST a -> (a, BST a)deleteMax (Node tl x Nil) = (x, tl)deleteMax (Node tl x tr) = let (y, ty) = deleteMax tr
in (y, Node tl x ty)
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 29 / 31
![Page 76: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/76.jpg)
Deleting from a tree
• We first tackle a simpler problem• Delete the maximum value• and return the value as well as the modified tree
• Maximum is the rightmost node:deleteMax :: Ord a => BST a -> (a, BST a)deleteMax (Node tl x Nil) = (x, tl)deleteMax (Node tl x tr) = let (y, ty) = deleteMax tr
in (y, Node tl x ty)
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 29 / 31
![Page 77: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/77.jpg)
Deleting from a tree
• We first tackle a simpler problem• Delete the maximum value• and return the value as well as the modified tree
• Maximum is the rightmost node:deleteMax :: Ord a => BST a -> (a, BST a)deleteMax (Node tl x Nil) = (x, tl)deleteMax (Node tl x tr) = let (y, ty) = deleteMax tr
in (y, Node tl x ty)
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 29 / 31
![Page 78: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/78.jpg)
Deleting from a tree
• We first tackle a simpler problem• Delete the maximum value• and return the value as well as the modified tree
• Maximum is the rightmost node:deleteMax :: Ord a => BST a -> (a, BST a)deleteMax (Node tl x Nil) = (x, tl)deleteMax (Node tl x tr) = let (y, ty) = deleteMax tr
in (y, Node tl x ty)
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 29 / 31
![Page 79: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/79.jpg)
Deleting from a tree
• Deleting a value v from a search tree
• If the tree is empty, nothing to do• If the tree is nonempty
• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and
• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 80: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/80.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do
• If the tree is nonempty
• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and
• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 81: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/81.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty
• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and
• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 82: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/82.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty• If v is smaller than the value at the root, delete from left subtree
• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and
• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 83: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/83.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree
• If v is equal to the value at the root, remove root and
• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 84: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/84.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and
• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 85: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/85.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and• If left subtree is empty, just slide the right subtree up a level
• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 86: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/86.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree
• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 87: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/87.jpg)
Deleting from a tree
• Deleting a value v from a search tree• If the tree is empty, nothing to do• If the tree is nonempty• If v is smaller than the value at the root, delete from left subtree• If v is larger than the value at the root, delete from right subtree• If v is equal to the value at the root, remove root and• If left subtree is empty, just slide the right subtree up a level• If left subtree is non-empty, replace root by maximum element of leftsubtree• Search tree property is preserved
Suresh PRGH 2019: Lecture 22 October 30, 2019 30 / 31
![Page 88: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/88.jpg)
Deleting from a tree
• Code for delete:deleteBST :: Ord a => a -> BST a -> BST adeleteBST v Nil = NildeleteBST v (Node tl x tr)| v < x = Node (deleteBST v tl) x tr| v > x = Node tl x (deleteBST v tr)| v == x = if isEmpty tl then tr else Node ty y tr
where (y, ty) = deleteMax tl
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 31 / 31
![Page 89: Programming in Haskell: Lecture 22](https://reader034.fdocuments.us/reader034/viewer/2022042408/625e8ddf499c52488570a076/html5/thumbnails/89.jpg)
Deleting from a tree
• Code for delete:deleteBST :: Ord a => a -> BST a -> BST adeleteBST v Nil = NildeleteBST v (Node tl x tr)| v < x = Node (deleteBST v tl) x tr| v > x = Node tl x (deleteBST v tr)| v == x = if isEmpty tl then tr else Node ty y tr
where (y, ty) = deleteMax tl
• Worst case running time: Height of the tree
Suresh PRGH 2019: Lecture 22 October 30, 2019 31 / 31