## AVL Tree

```there is an interactive demo here

video part1
video part2

you will create an AVL Tree
and a menu driven main files

copy all the files provided for you
over from your tested and fully functional BST homework

do a search and replace in your main and BST.h
replace BST with AVL
rename BST.h to AVL.h

you will then need to add the following functions to your AVL class

this will enable to rotate nodes.. like so

current_node->left =  leftRotate(current_node->left);
current_node  = rightRotate(current_node);

you will then need to modify your InsertSubtree function so that it returns a TreeNode* instead of bool

you will no longer return true if the insert happens you will return a node in the tree
(each of the scenarios below tell you what to return)

EVERY SINGLE TIME you call InsertSubtree you will need to set the node * that you used as a parameter to the value the funtion returns.
ie
return InsertSubtree(root, 123)
becomes
root = InsertSubtree(root, 123 )
or

return  InsertSubtree(node->left, 123)
becomes
node->left = InsertSubtree(node->left,123);

this will afford you the posibility of rotating the nodes inside the insert function

the modified logic for  insert will be

// if current_node is nullptr insert here
// set current_node to new TreeNode *
// return current_node

// if the current_node contains the value we are supposed to insert
// simply return current_node, nothing else

// we need to call insert for either the left or right side of the subtree
//  so do you insert to the left or right?
if (elem < subtree->data)
{
subtree->left  = insertSubtreeAVL(subtree->left, elem);
}
else
{
subtree->right = insertSubtreeAVL(subtree->right, elem);
}

// so now we need to balance the tree
// create a couple int variables left_height and right_height
// use the height function to set left_height and right_height by passing in the right and left pointer

// LL scenario
// cout "TestLL"
// the left_height > right_height+1
// AND the value that was just added is
// smaller than the value in the left child node
// action:
// rotate the current_node to the right
// return the current_node

// LR scenario
// cout "TestLR"
// the left_height > right_height+1
// AND the value just added is
// larger than the value in the left child node
// action:
// rotate left child node to the left
// then rotate the current_node to the right
// return the current_node

// RR scenario
// cout "TestRR"
// the right_height > left_height+1
// AND the value that was just added is
// larger than the value in the right child node
// action:
// rotate the current_node to the left
// return the current_node

// RL scenario
// cout "TestRL"
// the right_height > left_height+1
// AND the value just added is
// less than the value in the right child node
// action:
// rotate right child node to the right
// then rotate the current_node to the left
// return the current_node

// last line of the function
// return current_node , if none of the 4 scenarios where used

the output when testing should match that of the runable examples
there are 4 int type testfiles in the lab directory that are designed specifically to test the AVL funcionality
or use the values below

testRR
i50i40i60i55i35i70i80d35i65px

testRL
i50i40i60i35i70i55i58d35i52px

testLL
i50i60i25i65i30i20i15d65i22px

testLR
i50i60i25i65i30i20i27d65i33px

all of these files needs to produce a FULL and BALANCED tree

take the output and paste it into the viewtree page so that you can see if tree is full and balanced.

```