260 likes | 413 Views
Introduction Data structure AVL tree balance condition AVL node level AVL rotations Choosing the rotation Performing a balanced insertion Outputting data Testing and results. AVL Balanced Trees.
E N D
Introduction Data structure AVL tree balance condition AVL node level AVL rotations Choosing the rotation Performing a balanced insertion Outputting data Testing and results AVL Balanced Trees
There is no reason why a Knuth binary tree should balance. Average performance for random input should not be greatly below balanced performance, but if the tree is made from sorted input, it will degrade to a linked list with access time of O(N) where there are N nodes. Access time for a node within a balanced tree will be log2N or slightly less. Operations which change the balance of a tree are insertion and deletion. Insertion might increase the maximum depth of a tree, but deletion can't do this. Therefore, if effort is going to be expended in balancing an unbalanced tree, by rearranging nodes, this can initially be most usefully applied following insertion of nodes. Introduction 1
A perfectly balanced tree can only exist if N is 2x1 where x is an integer, i.e. if N is a value the series 1, 3, 7, 15, 31, 63, 127, 255 ... . The need for perfect balance could be relaxed by allowing the bottom level of the tree to be partially filled. This is difficult to achieve, as the entire tree might need rearranging after every insertion and deletion. The imbalance problem only arises within the path through the tree on which a node is inserted. A recursive insertion function will return upwards through the insertion path. If information about the maximum depths of nodes is maintained as part of each nodes structure, it is possible to correct imbalances through localised rearrangements following insertion on the recursive return path upwards to the root. Introduction 2
A particular approach to performing the tree rearrangements needed to keep a tree balanced was designed by AdelsonVelskii and Landis and named as the AVL tree. An AVL tree has a balance condition such that each node stores the maximum depth of nodes below it. A NULL tree has a level of 1 and a leaf node has a level of 0. A node having 1 or 2 subtrees will have as its own level the maximum of left or right subtree levels +1. Within an AVL tree, the maximum difference allowed between left and right subtree levels is 1. When an insertion or deletion operation results in this difference increasing to 2, rearrangements called rotations are performed to reduce the imbalance for an AVL tree to retain the AVL balance condition. AVL Tree Balance Condition
Following an insertion or deletion which may influence the levels of subtrees, the level of nodes affected will need to be recalculated. This can be achieved using a function operating on the above data structure as follows: AVL Node Level
A difference of levels between left and right subtrees can be increased, through insertion of a new node into the tree, in one of 4 possible ways: 1. Insertion into left subtree of left branch. 2. Insertion into right subtree of left branch. 3. Insertion into left subtree of right branch. 4. Insertion into right subtree of right branch. The function prototype for a rotation will be of theform: void rotN(TOP *t); /* N is rotation type 1-4 */ AVL Rotations
Choosing the rotation slide 1 The rotation type 1 4 can be determined by comparing 3 keys, the key inserted and the child and parent key. It is useful to have a 2 way comparison function similar to the strcmp() function in string.h.
Printing the entire tree can be done recursively in search order. It is useful when debugging to be able to identify the immediate left and right child nodes for each record printed. #define DEBUG 1 /* or 0 for less noisy output */ Using a printdata function enables the printall function to be data independent. void printdata(DATA d){ /* prints DATA item d */ printf("%c ",d); } Output of AVL organised data 1
AVL imbalance : -2 AVL type: 4 AVL imbalance : -2 AVL type: 3 AVL imbalance : 2 AVL type: 2 ... o insert: duplicate key error ... (run the program avltree.c to see full o/p) a 0 a b 2 c c 1 d d 0 b e 3 g f 0 f g 1 h h 0 e i 4 k j 0 j k 2 m l 0 l m 1 i n 5 u o 1 p p 0 o q 2 s r 0 r s 1 t t 0 q u 3 w v 0 v w 2 y x 0 x y 1 z z 0 These results show in 4 columns per node: i. The left child key or blank. ii. The node key. iii. The node level. iv. The right key or blank. Test Results
"Data Structures and Algorithms in C", Mark Allen Weiss, Addison Wesley Chapter 4. Recommended Reading