### CSC 321: Data Structures Fall 2018 HW5: Recursion & Binary Search Trees

1. Add the following methods to the BinaryTree class:
 `height()  ` Returns the height of the tree, i.e., the length of the longest path from the root to a leaf. `weight()  ` Returns the weight of the tree, i.e., the sum of all the node depths.
and the following method to the BinarySearchTree class:
 `avgSearchCost()  ` Returns the average cost of a search in the tree, i.e., weight/size.
Note: all three methods should return 0 if applied to an empty tree. Be sure to test your methods thoroughly before continuing.

2. It has been proven that adding N random elements to a binary search tree will produce, on average, a tree with O(log N) height. As a result, the average search cost for an arbitrary item in such a binary search tree is O(log N). You are to verify these results experimentally. Write a program that prompts the user for the number of items to be stored (N) and the number of trees to generate (T). Then, it should repeatedly (T times) store N random numbers in a binary search tree and compute the height and average cost of searching that tree.

Your program should display the average of these heights and costs over all of the constructed trees, as well as the minimum possible tree height (log2(N+1)). For example,

Number of values to be stored: 1000 Number of trees to generate: 100 Generating 100 trees with 1000 random values: min possible height = 10 average tree height = 21.76 average search cost = 11.9146
3. Run your program from part 2 for various values of N, using T = 1,000. Report the average height and cost of searching the trees you constructed. Do your statistics support the claims that the average height and cost of searching a randomly constructed binary search tree are both O(log N)? Justify your answer.

number of values (N) min possible height average tree height average search cost
N =   1,000
N =   2,000
N =   4,000
N =   8,000
N = 16,000
N = 32,000