ELEC278 1 Lab 4 - Fall 2022
ELEC 278 – Data Structures and Algorithms
Lab 4: AVL Trees
Start: November 2, 2022 Due: Day 7 of Lab Day
Contents
1. Basic Lab Information........................................................................................................................ 2
1.1 Background ................................................................................................................................. 2
2. Lab Resources.................................................................................................................................... 2
2.1 List of Files provided with this Lab .............................................................................................. 3
3. Lab Objective ..................................................................................................................................... 3
3.1 Topics covered in this lab ............................................................................................................ 3
4. Lab Steps ........................................................................................................................................... 3
4.1 Overview ..................................................................................................................................... 3
4.2 Files you will be submitting ......................................................................................................... 5
4.3 Deliverable 1 – Add Missing Routines to AVL Code .................................................................... 5
4.4 Deliverable 1B - Add delete functionality to AVL. ...................................................................... 6
4.5 Deliverable 2 – Compare AVL and BST Performance .................................................................. 7
ELEC278 2 Lab 4 - Fall 2022
1. Basic Lab Information
You should review the Lab Overview document prior to reading the material for this lab exercise.
If you have already installed a C compiler on your computer (or have one available), then you can
continue with the lab. If you have not installed the C programming tools, please stop working on this
lab, and review Lab Overview document Appendix A. You may also wish to review Tutorial 1 before
you attempt this lab.
You should also review Appendix B of the Lab Overview document. This contains important
information about how to submit your assignment.
You may also find it useful to review previous labs, especially Lab 03, as you work on this lab exercise.
1.1 Background
A weakness with binary search trees (BSTs) is that it is possible for their search performance to
degrade significantly. If the data inserted into a BST is somewhat ordered, then the tree begins to
resemble a long linked list, with a few branches off to the side. Performance on searches degrades
significantly as well, moving from O(logN) towards O(N).
2. Lab Resources
Specific to this lab:
1. Lab Instructions (this document)
2. A zip file containing source code (in a folder called Lab04Src). Check the file “PACKING.LIST” (it
is a plain text file) for a list of files that are included.
Learner provided:
1. Programming environment selected by the learner. The Lab Overview document provides a list
of possible C programming tools that you may use.
This lab has code for you to read. The purpose of the example code is to reinforce what you have seen
in the class material. It also provides you with code to cut-and-paste into the code you write to solve
the assigned problems. This lab has multiple programming problems to solve.
Note on supplied code:
You will notice that the supplied collection of code contains a version of BST like last lab’s code but
missing some important components. This is because both BST and AVL trees are Binary trees, and
the code to create a tree descriptor and a node are the same for both. The code to do a find for a
specified key is also common to both BST and AVL. Where the code differs is in the Insert routine and
in the Delete routine. The supplied BST code does not include a delete because it is not required for
the lab. Also note that print routines could have been placed in the generic bintree.c module, but they
were not.
You will see why a BST module is included when you look at the second deliverable for this lab.
ELEC278 3 Lab 4 - Fall 2022
2.1 List of Files provided with this Lab
(See the file PACKING.LIST included in the Lab04Src.zip file for the most up-to-date list.)
avl.c
avl.h
bintree.c
bintree.h
bst.c
bst.h
lab04data_B.txt
main.c
main_B.c
Makefile
MakeRandom.c
avl_data_A.txt
output.txt
Packing.List
3. Lab Objective
There are two objectives for this lab:
a) Add three import
b) Something else
c) Using code from Lab 3, compare the performance of BST and AVL trees.
3.1 Topics covered in this lab
? AVL Trees (BSTs) – Implementation choices.
? Performance comparison between AVL and BST searches.
4. Lab Steps
4.1 Overview
This lab includes two steps, all of which involve adding code to the code provided to you in the zipped
directory lab04Materials.zip.
In the first step, you will implement code to calculate the height and balance factor of any node in an
AVL tree, and you will also implement functions to rebalance an AVL node after an insertion
(rotations).
From the node definition, you can see that each node has a field recording its own height. Start by
assuming that the heights of the left and right subtrees are correct. Calculate the height of the node
ELEC278 4 Lab 4 - Fall 2022
root using the heights of its subtrees. No recursion is needed here.
The balance factor of a node root is :
= ?
After a value is inserted in the tree, the tree may be unbalanced. If the balance factor if a node is less
than -1 or greater than 1, then the node is unbalanced and needs rebalancing.
As discussed in class, there are 4 types of rotations:
Name Rotation
Left of Left (LoL) Right rotation
Right of Right (RoR) Left rotation
Right of Left (RoL)
Left rotation on
subtree
Then Right rotation
Left of Right (LoR)
Right rotation on
subtree
Then Left rotation
Determine the type of rotation needed and perform it on the tree.
In the second step, you will modify the supplied BST code, so that the routine to implement an insert
in the BST has the same interface as the code to insert to the AVL. That is, if you inspect the AVL code
you will see the code to do an insert is called with a pointer to the AVL Tree, but the code to do an
insert to the BST is called with a pointer to a node. You will create a version of insert for the BST tree
that is called with a pointer to the BST (tree). Look carefully at the AVL code, because you will see
that it is necessary for recursion purposes, to have an insert function with a parent node pointer as
parameter.
The point of the second step is to compare the performance of AVL and BST. There is a file containing
a large set of numbers that has been deliberately constructed to exploit a BST weakness – its
tendency to become quite imbalanced if its data is inserted somewhat in order. I have provided the
ELEC278 5 Lab 4 - Fall 2022
code for the data file generator – it produces a large number of random numbers (which, in theory,
are supposed to be evenly distributed through the range) but then takes the 9th decade of the
numbers and sorts them. So, about 10 percent of the numbers get inserted in one long chain, with
some of the remaining 10 percent of the numbers forming small branches off the chain.
Once the two trees are built, finds are performed on the trees. You will notice in main_B.c that the
last 10 numbers read in are saved and used for searches. The code searches for these 10 numbers a
million times – a total of 10 million searches. Both the BST and AVL tests completed in a few seconds.
(You may be interested to know that I had a chance to try the code on an old IBM PC-AT with an
80286 processor. The test took almost 2 hours. The computer is not reliable, and I was not sure if it
would crash before it completed the test.)
Remember that the generic binary tree code is in bintree.c, the AVL-specific code is in avl.c and the
BST-specific code is in bst.c.
4.2 Files you will be submitting
You will be submitting three (3) files: LAB4_AVL.c, LAB4_BST.c and LAB4_MAINB.c.
The code you need to write for these files is described in more detail in the following sections.
4.3 Deliverable 1 – Add Missing Routines to AVL Code
You will notice that the following functions in AVL.C require operational code. Add the code. Test
your code using MAIN.C.
MAIN.C reads data from one of two sources. If the program (called avl.exe if you use the supplied
makefile) is run without parameters, it reads a default input file containing 10 numbers. The output
from the program should be like this, except for the lines about unbalanced nodes and rotations:
Node* rotateRight(Node* root)
// Rotate to right. Returns new root pointer.
Node* rotateLeft(Node* root)
// Rotate to left. Returns new root pointer.
int getBalanceFactor(Node* root)
// Get balance factor - difference between left height and right height
int calcHeight(Node* root)
// Calculate height of this node by adding 1 to maximum of left, right
// child height.
Node* rebalance(Node* root)
// Check balance factor to see if balancing required (bf > 1 or bf < -1).
// If balancing required, perform necessary rotations.
ELEC278 6 Lab 4 - Fall 2022
4.4 Deliverable 1B - Add delete functionality to AVL.
The functions required to implement deleting a node from an AVL are not provided. You will need to
add operational code for findParentHelper() and delete(). You will have to build an interface for
testing; the markers will use a different version of main.c to test your code.
Inserting 10
Inorder: 10(h=0,bf=0) -
-------
Inserting 3
Inorder: 3(h=0,bf=0) - 10(h=1,bf=1) -
-------
Inserting 1
Node 10 is unbalanced. Left of Left: Rotate Right
Inorder: 1(h=0,bf=0) - 3(h=1,bf=0) - 10(h=0,bf=0) -
-------
Inserting 7
Inorder: 1(h=0,bf=0) - 3(h=2,bf=-1) - 7(h=0,bf=0) - 10(h=1,bf=1) -
-------
Inserting 20
Inorder: 1(h=0,bf=0) - 3(h=2,bf=-1) - 7(h=0,bf=0) - 10(h=1,bf=0) - 20(h=0,bf=0) -
-------
Inserting 15
Node 3 is unbalanced. Right of Right: Rotate Left
Inorder: 1(h=0,bf=0) - 3(h=1,bf=0) - 7(h=0,bf=0) - 10(h=2,bf=0) - 15(h=0,bf=0) - 20(h=1,bf=1) -
-------
Inserting 18
Node 20 is unbalanced. Right of Left: Rotate Left
Rotate Right
Inorder: 1(h=0,bf=0) - 3(h=1,bf=0) - 7(h=0,bf=0) - 10(h=2,bf=0) - 15(h=0,bf=0) - 18(h=1,bf=0) - 20(h=0,bf=0) -
-------
Inserting 17
Inorder: 1(h=0,bf=0) - 3(h=1,bf=0) - 7(h=0,bf=0) - 10(h=3,bf=-1) - 15(h=1,bf=-1) - 17(h=0,bf=0) - 18(h=2,bf=1) -
20(h=0,bf=0) -
-------
Inserting 16
Node 15 is unbalanced. Left of Right: Rotate Right
Rotate Left
Inorder: 1(h=0,bf=0) - 3(h=1,bf=0) - 7(h=0,bf=0) - 10(h=3,bf=-1) - 15(h=0,bf=0) - 16(h=1,bf=0) - 17(h=0,bf=0) -
18(h=2,bf=1) - 20(h=0,bf=0) -
-------
Inserting 22
Inorder: 1(h=0,bf=0) - 3(h=1,bf=0) - 7(h=0,bf=0) - 10(h=3,bf=-1) - 15(h=0,bf=0) - 16(h=1,bf=0) - 17(h=0,bf=0) -
18(h=2,bf=0) - 20(h=1,bf=-1) - 22(h=0,bf=0) -
-------
ELEC278 7 Lab 4 - Fall 2022
Detailed specifications:
The file name that you provide shall be LAB4_AVL.C
The program takes input from a file - either the default if no file name is provided on the
command line – the values to insert are found in the default input file. When testing your
program, the values used by the markers may be different.
The output is determined by the existing code – PLEASE DO NOT ALTER THE OUTPUT
FORMAT.
The first line of your program shall conform to the course standard for headlines, that is, it
should be
// LAB4_AVL.c – Lab 04 – FirstName, LastName
4.5 Deliverable 2 – Compare AVL and BST Performance
As noted above in 4.1 Overview, the second part of the lab involves comparing the performance of
AVL and BST on identical data. The module containing main() for this part is called main_B.c.
Review this file (main_B.c) and see how it stores data and how it runs a test. Modify it so that it
stores the data in a BST as well as the AVL Tree.
Further modify main_B.c so that it runs a comparable test using the BST as is run on the AVL.
As noted in 4.1 Overview, the BST code carried over from lab 3 does not have the same interface for
insert as the AVL code. The BST code only takes a pointer to a node (making it easier to handle the
recursion) and the AVL code takes a pointer to a tree – and deals with the recursion by having a
second recursive routine. Write code in BST.C to make the BST interface match the AVL interface.
(When looking at the AVL version, can you see a reason why getting a pointer to the tree is preferable
to getting a pointer to a node?)
Detailed specifications:
The two source file names shall be LAB4_BST.c and LAB4_MAINB.c.
The input mechanism and command line interface shall be unchanged from the supplied code.
The first line of your files shall conform to the course standard for headlines, that is, it should
be
// LAB4_XXXX.c – Lab 04 – FirstName, LastName
where XXXX is either BST or MAINB