In computer science, an AVL tree is a
self-balancing binary search tree, and it was the first such data structure to
be invented. In an AVL tree, the heights of the two child subtrees of any
node differ by at most one; if at any time they differ by more than one,
rebalancing is done to restore this property. Lookup, insertion, and deletion
all take O(log n) time in both the average and worst cases, where n
is the number of nodes in the tree prior to the operation. Insertions and
deletions may require the tree to be rebalanced by one or more tree rotations.
Operations
Tree
rotations
Basic operations of an AVL tree involve
carrying out the same actions as would be carried out on an unbalanced binary
search tree, but modifications are followed by zero or more operations called
tree rotations, which help to restore the height balance of the subtrees.
Searching
Once a node has been found in a
balanced tree, the next or previous nodes can
be explored in amortized constant time. Some instances of exploring these
"nearby" nodes require traversing up to 2×log(n) links
(particularly when moving from the rightmost leaf of the root's left subtree to
the leftmost leaf of the root's right subtree). However, exploring all n nodes
of the tree in this manner would use each link exactly twice: one traversal to
enter the subtree rooted at that node, another to leave that node's subtree
after having explored it. And since there are n−1 links in any
tree, the amortized cost is found to be 2×(n−1)/n, or
approximately 2.
Insertion
Pictorial
description of how rotations cause rebalancing tree, and then retracing one's
steps toward the root updating the balance factor of the nodes. The numbered
circles represent the nodes being balanced. The lettered triangles represent
subtrees which are themselves balanced BST.
After inserting a node, it is necessary
to check each of the node's ancestors for consistency with the rules of AVL.
The balance factor is calculated as follows: balanceFactor =
height(left-subtree) - height(right-subtree). For each node checked, if the
balance factor remains −1, 0, or +1 then no rotations are necessary. However,
if balance factor becomes less than -1 or greater than +1, the subtree rooted
at this node is unbalanced. If insertions are performed serially, after each
insertion, at most one of the following cases needs to be resolved to restore
the entire tree to the rules of AVL.
There are four cases which need to be considered, of which two are symmetric to the other two. Let P be the root of the unbalanced subtree, with R and L denoting the right and left children of P respectively.
Right-Right case and Right-Left case:
There are four cases which need to be considered, of which two are symmetric to the other two. Let P be the root of the unbalanced subtree, with R and L denoting the right and left children of P respectively.
Right-Right case and Right-Left case:
·
If the balance factor of P is -2 then the right subtree
outweighs the left subtree of the given node, and the balance factor of the
right child (R) must be checked. The left rotation with P as the root is
necessary.
o
If the balance factor of R is -1 (or in case of deletion
also 0), a single
left rotation(with P as the root) is needed (Right-Right case).
o
If the balance factor of R is +1, two different rotations
are needed. The first rotation is a right
rotation with
R as the root. The second is a left
rotation with
P as the root (Right-Left case).
Left-Left case and Left-Right case:
·
If the balance factor of P is 2, then the left subtree
outweighs the right subtree of the given node, and the balance factor of the
left child (L) must be checked. The right rotation with P as the root is
necessary.
o
If the balance factor of L is +1 (or in case of deletion
also 0), a single
right rotation(with P as the root) is needed (Left-Left case).
o
If the balance factor of L is -1, two different rotations
are needed. The first rotation is a left
rotation with
L as the root. The second is a right
rotation with
P as the root (Left-Right case).
Deletion
If the node is a leaf
or has only one child, remove it. Otherwise, replace it with either the largest
in its left sub tree (in order predecessor) or the smallest in its right sub
tree (in order successor), and remove that node. The node that was found as a
replacement has at most one sub tree. After deletion, retrace the path back up
the tree (parent of the replacement) to the root, adjusting the balance factors
as needed.As with all binary trees, a node's in-order successor is the left-most child of its right subtree, and a node's in-order predecessor is the right-most child of its left subtree. In either case, this node will have zero or one children. Delete it according to one of the two simpler cases above.
In addition to the
balancing described above for insertions, if the balance factor for the tree is
2 and that of the left subtree is 0, a right rotation must be performed on P.
The mirror of this case is also necessary.
The retracing can stop if the balance factor becomes −1 or +1 indicating that the height of that subtree has remained unchanged. If the balance factor becomes 0 then the height of the subtree has decreased by one and the retracing needs to continue. If the balance factor becomes −2 or +2 then the subtree is unbalanced and needs to be rotated to fix it. If the rotation leaves the subtree's balance factor at 0 then the retracing towards the root must continue since the height of this subtree has decreased by one. This is in contrast to an insertion where a rotation resulting in a balance factor of 0 indicated that the subtree's height has remained unchanged.
The time required is O(log n) for lookup, plus a maximum of O(log n) rotations on the way back to the root, so the operation can be completed in O(log n) time.
The retracing can stop if the balance factor becomes −1 or +1 indicating that the height of that subtree has remained unchanged. If the balance factor becomes 0 then the height of the subtree has decreased by one and the retracing needs to continue. If the balance factor becomes −2 or +2 then the subtree is unbalanced and needs to be rotated to fix it. If the rotation leaves the subtree's balance factor at 0 then the retracing towards the root must continue since the height of this subtree has decreased by one. This is in contrast to an insertion where a rotation resulting in a balance factor of 0 indicated that the subtree's height has remained unchanged.
The time required is O(log n) for lookup, plus a maximum of O(log n) rotations on the way back to the root, so the operation can be completed in O(log n) time.
Tidak ada komentar:
Posting Komentar