Professional Documents
Culture Documents
________________________________________________________ A binary tree is an AVL tree if Each node satisfies BST property key of the node is grater than the key of each node in its left subtree and is smaller than the key of each node in its right subtree
Each node satisfies height-balanced-1-tree property the difference between the heights of the left subtree and right subtree of the node does not exceed one
Proof: Let us bound n(h): the minimum number of internal nodes of an AVL tree of eight h. We easily see that n(1) = 1 and n(2) = 2. For n > 2, an AVL tree of height h contains the root node, one AVL x subtree of height n-1 and another of height n-2.
That is, n(h) = 1 + n(h-1) + n(h-2) Knowing n(h-1) > n(h-2), we get n(h) > 2n(h-2). So n(h) > 2n(h-2), n(h) > 4n(h-4), n(h) > 8n(n-6), (by induction), n(h) > 2in(h-2i ) Solving the base case we get: n(h) > 2 h/2-1 Taking logarithms: h < 2log n(h) +2 Thus the height of an AVL tree is O(log n)
N(h-1)
N(h-2)
Perfect Balance
Want a complete tree after every operation
tree is full except possibly in the lower right
This is expensive
For example, insert 2 in the tree on the left and then rebuild as a complete tree
6 5
4
1 5 8
2
4 6
8
9
Node Heights
Tree A (AVL) height=2 BF=1-0=1 Tree B (AVL) 2
6
1 0 1
6
1
4
0 0
9
0
4
0 0
9 5 8
6
1 1 1
6 4
0 0 1
4
0 0 0
9 5
9
-1
5
0
6
1 2 1
6
1
4
0 0 1
9
0
4
0
8
0
0
5
0
8 7
j
h h
k
h
j k
h+1 h h
Y
X
j k
h+1 h
Do a right rotation
Y
X
j k
h+1 h
Do a right rotation
Y
X
k
h+1
h
j
h
j
h h
k
h
j
k
h+1
k
h
j
h+1
X Y
j
h h+1
k
h
j
h
k
h
X
V
h+1
h or h-1
j k i V
j i k W X V
j i k W X V
i k
h h or h-1
j
h
Implementation
balance (1,0,-1) key left right
No need to keep the height; just the difference in height, i.e. the balance factor; this has to be modified on the path of insertion even if you dont perform rotations Once you have performed a rotation (single or double) you wont need to go back up the tree
Single Rotation
RotateFromRight(n : reference node pointer) { p : node pointer; p := n.right; n n.right := p.left; p.left := n; n := p }
You also need to modify the heights or balance factors of n and p X
Insert
Y Z
Double Rotation
Implement Double Rotation in two lines.
DoubleRotateFromRight(n : reference node pointer) { ???? n }
X Z V W
Insert in BST
Insert(T : reference tree pointer, x : element) : integer { if T = null then T := new tree; T.data := x; return 1;//the links to //children are null case T.data = x : return 0; //Duplicate do nothing T.data > x : return Insert(T.left, x); T.data < x : return Insert(T.right, x); endcase }
20
0 1
Insert 5, 40 0
10
0
30 25 35
20
1 1 1
20 30
0
10
0
0
30
0
10
0
25
35
5
Now Insert 45
25
35
0
40
20
1
20 30
0
10
0
0
30
2
10
0
25
Imbalance
35
1 40 0 45
25
0
40 1
0
35
Now Insert 34
45
20
1
20 35
1 0 25
10
0
0 Imbalance 25
30
2
10
0
40
1 35
5 45 0
30 34
40 1
0
45
Insertion of 34 0
34
IF tree is right heavy { IF tree's right subtree is left heavy { Perform Double Left rotation } ELSE { Perform Single Left rotation } } ELSE IF tree is left heavy { IF tree's left subtree is right heavy { Perform Double Right rotation } ELSE { Perform Single Right rotation } }