Make a class BinTree that represents a binary tree. The nodes of the tree contain int values, and they don't have to refer to the parent. 1a. Make a constructor that creates a tree that consists of a single leaf. 1b. Make a constructor that puts a tree together from its two sides and a value for the top node. Solve the following exercises using recursion: 2a. Make a toString operation for the tree. The output should look similar to this: (((-, 5, -), 6, -), 6, -) 2b. Make another version of toString which formats the trees like this: 6 - - 6 - - 6 6 5 - - - - 2c1. Make a function `sum` that returns the sum of the values in the tree. 2c2. Make a function `depth` that returns the length of the longest path from root to leaf in the tree. 2c3. Make a function `mirror` that returns a tree in which the left and right sides are reversed as compared to the original. 2c4. Make a function `replace` that takes two numbers, and returns a tree that looks just like the original, except that all instances of the first number are replaced by the second.