MTree in PureScript: A Detailed Overview
In this article, we’ll examine the concept of MTree, a specialized tree structure, and demonstrate how it’s implemented in PureScript.
What is an MTree?
An MTree is a type of binary tree where each node carries an additional piece of information: the maximum value found in that tree. This includes the node’s value itself and all values in its left and right child subtrees.
data MTree a
= Leaf
| Node (MTree a) a a (MTree a) -- l max value r
PureScript Implementation
Building an MTree
An MTree is defined recursively. An MTree is either a Leaf or a Node which consists of a left MTree, the maximum value within that node’s tree, the node’s value, and the right MTree.
Operations on MTree
Set Creation
A set representation of an MTree can be created using the setMTree function. This function traverses the MTree and adds all node values to a Set.
setMTree :: forall a. Ord a => MTree a -> Set a
setMTree tree =
case tree of
Leaf -> empty::Set a
Node left _ value right ->
let subset1 = insert (setMTree left) value
subset2 = setMTree right
in union subset1 subset2
Maximum Binary Search Tree Validation
To check if an MTree maintains the properties of a Maximum Binary Search Tree (MBST), we use the mbst function. This function validates three conditions:
- The subtrees
landrshould themselves be valid MBSTs. - The node’s value
ashould be greater than all elements in the left subtree and less than all elements in the right subtree. - The maximum value
mfor the node should be greater than all values in the tree rooted at the node and also be present in the tree rooted at the node.
mbst :: forall a. Ord a => MTree a -> Boolean
mbst tree =
case tree of
Leaf -> true
Node l m a r -> (mbst l) && (mbst r) &&
(all (lessThan a) (setMTree r)) &&
(all (greaterThan a) (setMTree l)) &&
(all (greaterThan m) (setMTree (Node Leaf m a r))) &&
(belongsto m (setMTree (Node Leaf m a r)))
Conclusion
MTree is a valuable variation of the binary tree that can allow for more efficient processing of certain tree operations, like retrieving the maximum value in a tree. Its implementation in PureScript demonstrates the flexibility and power of the PureScript type system, as well as its capacity for effectively modeling and solving complex data structures and problems.