parent
/ \
/ \
left right
Binary search trees stores information (keys) holding some constraint. Each node holds some value. A left node holds value less than or equal to the parent node and right node holds value greater than parent node.
Motivation:
Interval scheduling problems can be solved efficiently with binary search trees. We will need to traverse left and right to see where a given interval should fit into. If that place is already taken or being overlapped by an existing interval, we discard the interval otherwise we insert it.
BST operations
0. insert : insert a key to the tree if the key does not already exist.
1. search : check if a key is present in the tree or not.
2. delete : delete a key if exist in the tree.
0. Insert
def insert (node, key):
if node == null:
return new Node(key)
else if node.key == key:
return node
else if (node.key > key):
node.left = insert(node.left, key)
else:
node.right = insert(node.right, key)
1. Search
def search(node, key):
if node == null:
return false
if node.key == key:
return true
else if node.key > key:
return search(node.left, key)
else
return search(node.right, key)
2. delete:
def delete(node, key):
if node == null:
return node
if node.key == key:
if node.left == null
return node.right
else if node.left.right == null
return node.left
else
new_node = get_right_most(node.left)
delete_right_most(node.left)
new_node.left = node.left
new_node.right = node.right
return new_node
else if node.key > key:
node.left = delete(node.left, key)
else
node.right = delete(node.right, key)
return node
Augmented Binary Tree
When a binary tree holds information along with keys, it is called augmented binary tree. A common augmented BST is storing node counts of a subtree.
We will be discussing about the following binary search trees
0. avl tree
1 red-black tree
2. b-tree
AVL Tree
Self balancing binary trees. Balances herself using "rotate" operation. There can be log n number of rotations.
This tree is an augmented data structure. Every node contains the following information
height of subtree
left child
right child
property:
at any node, let h_left and h_right are left sub tree height and right sub tree height.
|h_left - h_right| <= 1
number of nodes, at worst case, N_h = 1 + N_(h-1) + N_(h-2) [because in best case both the left and right will be balanced]
1 + N_(h-1) + N_(h-2) > 1 + 2 * N_(h-2) > 2 * N_(h-2)
N_h > 2 * N(h-2)
so number of nodes N = 2 ^ (h/2) => h = O(logn)
Rotation:
x <- left rotate y
/ \ right rotate -> / \
A y x C
/ \ / \
B C A B
in order traversal produces A x B y C for both the trees.
insert:
simple bst insert
fix avl property broken at any point of insertion. move up.
while insertion, the following cases can occur where AVL tree properties are broken at node x.
0. Right child is right heavy.
x (h)
/ \
(h-3) A y (h-1)
/ \
(h-3) B C (h-2)
a left rotate against right child, y fixes the properties.
y (h-1)
/ \
(h-2) x C (h-2)
/ \
A B [both A and B have h-3 height]
1. Right child is left heavy
x (h)
/ \
(h-3) A y (h-1)
/ \
(h-2) z C (h-3)
/ \
(h-3) B D (h-4)
do a right rotate with respect to y
x (h)
/ \
(h-3) A z (h-1)
/ \
(h-3) B y (h-2)
/ \
(h-4) D C (h-3)
now we have the same situation as case 0. do as we did in case 0.
Mirror situation occurs for left heaviness.
No comments:
Post a Comment