AVL TREES There is a large database containing the names, social security numbers, and birth dates of 131,071 people (that is 2 to the power of 17 minus 1). Every line in the file follows this pattern: 638915676 Aaron Rutherford 19640324 which shows that Aaron Rutherford was born on 24th March 1964 and his social security number is 638-91-5676. No names have any spaces in them. Your program is to read in the entire file, creating an object to represent each person in this style: struct person { string firstname, lastname; int ssn, birthdate; ... You may add to that, you may use char * instead of string if you want, it can be a class with methods if you want, but the four pieces of data for each person must be kept separate. These objects are to be put into a binary tree which is ordered based on name: alphabetical order on last names, and if two people have the same last name, alphabetical order on first name. If both names are the same, use the social security number. The tree is to be kept balanced by using the AVL method. Once your program has read all the data and built the tree, it must show both the average and maximum depth of any node, then demonstrate its correctness by searching for names entered by the user. With 131,071 entries, there will be lots of duplicate names. Your program only needs to find one of the matches. There are two versions of the database file, and you should make sure your program works for both: 1. "/home/www/class/een511/dbrandom.txt" or http://rabbit.eng.miami.edu/class/een511/dbrandom.txt In this file the records are ordered by social security number, so they will be in random order as far as names are concerned. Even an ordinary binary tree should have good performance for this. 2. "/home/www/class/een511/dbsorted.txt" or http://rabbit.eng.miami.edu/class/een511/dbsorted.txt In this file the records are already ordered by name, so this will check that you really are balancing the tree properly.