— Grading note: 10pts total
— * 2pts for inBST
— * 1pt for all other definitions
module HW1 where
— | Integer-labeled binary trees.
data Tree
= Node Int Tree Tree — ^ Internal nodes
| Leaf Int — ^ Leaf nodes
deriving (Eq,Show)
— | An example binary tree, which will be used in tests.
t1 :: Tree
t1 = Node 1 (Node 2 (Node 3 (Leaf 4) (Leaf 5))
(Leaf 6))
(Node 7 (Leaf 8) (Leaf 9))
— | Another example binary tree. This one satisfies the BST property.
t2 :: Tree
t2 = Node 6 (Node 2 (Leaf 1) (Node 4 (Leaf 3) (Leaf 5)))
(Node 8 (Leaf 7) (Leaf 9))
— | Some more trees that violate the BST property.
t3, t4, t5, t6 :: Tree
t3 = Node 3 (Node 2 (Leaf 1) (Leaf 4)) (Leaf 5)
t4 = Node 3 (Leaf 1) (Node 4 (Leaf 2) (Leaf 5))
t5 = Node 4 (Node 2 (Leaf 3) (Leaf 1)) (Leaf 5)
t6 = Node 2 (Leaf 1) (Node 4 (Leaf 5) (Leaf 3))
— | All of the example trees in one list.
ts :: [Tree]
ts = [t1,t2,t3,t4,t5,t6]
— | The integer at the left-most node of a binary tree.
—
— >>> leftmost (Leaf 3)
— 3
—
— >>> leftmost (Node 5 (Leaf 6) (Leaf 7))
— 6
—
— >>> map leftmost ts
— [4,1,1,1,3,1]
—
leftmost = undefined
— | The integer at the right-most node of a binary tree.
—
— >>> rightmost (Leaf 3)
— 3
—
— >>> rightmost (Node 5 (Leaf 6) (Leaf 7))
— 7
—
— >>> map rightmost ts
— [9,9,5,5,5,3]
—
rightmost = undefined
— | Get the maximum integer from a binary tree.
—
— >>> maxInt (Leaf 3)
— 3
—
— >>> maxInt (Node 5 (Leaf 4) (Leaf 2))
— 5
—
— >>> maxInt (Node 5 (Leaf 7) (Leaf 2))
— 7
—
— >>> map maxInt ts
— [9,9,5,5,5,5]
—
maxInt = undefined
— | Get the minimum integer from a binary tree.
—
— >>> minInt (Leaf 3)
— 3
—
— >>> minInt (Node 2 (Leaf 5) (Leaf 4))
— 2
—
— >>> minInt (Node 5 (Leaf 4) (Leaf 7))
— 4
—
— >>> map minInt ts
— [1,1,1,1,1,1]
—
minInt = undefined
— | Get the sum of the integers in a binary tree.
—
— >>> sumInts (Leaf 3)
— 3
—
— >>> sumInts (Node 2 (Leaf 5) (Leaf 4))
— 11
—
— >>> sumInts (Node 10 t1 t2)
— 100
—
— >>> map sumInts ts
— [45,45,15,15,15,15]
—
sumInts = undefined
— | The list of integers encountered by a pre-order traversal of the tree.
—
— >>> preorder (Leaf 3)
— [3]
—
— >>> preorder (Node 5 (Leaf 6) (Leaf 7))
— [5,6,7]
—
— >>> preorder t1
— [1,2,3,4,5,6,7,8,9]
—
— >>> preorder t2
— [6,2,1,4,3,5,8,7,9]
—
— >>> map preorder [t3,t4,t5,t6]
— [[3,2,1,4,5],[3,1,4,2,5],[4,2,3,1,5],[2,1,4,5,3]]
—
preorder = undefined
— | The list of integers encountered by an in-order traversal of the tree.
—
— >>> inorder (Leaf 3)
— [3]
—
— >>> inorder (Node 5 (Leaf 6) (Leaf 7))
— [6,5,7]
—
— >>> inorder t1
— [4,3,5,2,6,1,8,7,9]
—
— >>> inorder t2
— [1,2,3,4,5,6,7,8,9]
—
— >>> map inorder [t3,t4,t5,t6]
— [[1,2,4,3,5],[1,3,2,4,5],[3,2,1,4,5],[1,2,5,4,3]]
—
inorder = undefined
— | Check whether a binary tree is a binary search tree.
—
— >>> isBST (Leaf 3)
— True
—
— >>> isBST (Node 5 (Leaf 6) (Leaf 7))
— False
—
— >>> map isBST ts
— [False,True,False,False,False,False]
—
isBST = undefined
— | Check whether a number is contained in a binary search tree.
— You should assume that the given tree is a binary search tree
— and *not* explore branches that cannot contain the value if
— this assumption holds. The last two test cases violate the
— assumption, but are there to help ensure that you do not
— explore irrelevant branches.
—
— >>> inBST 2 (Node 5 (Leaf 2) (Leaf 7))
— True
—
— >>> inBST 3 (Node 5 (Leaf 2) (Leaf 7))
— False
—
— >>> inBST 4 t2
— True
—
— >>> inBST 10 t2
— False
—
— >>> inBST 4 t3
— False
—
— >>> inBST 2 t4
— False
—
inBST = undefined