Skip to content

Added AVL Tree Data Structure and Made appropriate changes in Readme.md #17

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions Avl_Tree.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# Python code to insert a node in AVL tree
# A Binary Search Tree that gets balanced and achieves O(logn) time in searching for a node
# Generic tree node class
class TreeNode(object):
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.height = 1

# AVL tree class which supports the
# Insert operation
class AVL_Tree(object):

# Recursive function to insert key in
# subtree rooted with node and returns
# new root of subtree.
def insert(self, root, key):

# Step 1 - Perform normal BST
if not root:
return TreeNode(key)
elif key < root.val:
root.left = self.insert(root.left, key)
else:
root.right = self.insert(root.right, key)

# Step 2 - Update the height of the
# ancestor node
root.height = 1 + max(self.getHeight(root.left),
self.getHeight(root.right))

# Step 3 - Get the balance factor
balance = self.getBalance(root)

# Step 4 - If the node is unbalanced,
# then try out the 4 cases
# Case 1 - Left Left
if balance > 1 and key < root.left.val:
return self.rightRotate(root)

# Case 2 - Right Right
if balance < -1 and key > root.right.val:
return self.leftRotate(root)

# Case 3 - Left Right
if balance > 1 and key > root.left.val:
root.left = self.leftRotate(root.left)
return self.rightRotate(root)

# Case 4 - Right Left
if balance < -1 and key < root.right.val:
root.right = self.rightRotate(root.right)
return self.leftRotate(root)

return root

def leftRotate(self, z):

y = z.right
T2 = y.left

# Perform rotation
y.left = z
z.right = T2

# Update heights
z.height = 1 + max(self.getHeight(z.left),
self.getHeight(z.right))
y.height = 1 + max(self.getHeight(y.left),
self.getHeight(y.right))

# Return the new root
return y

def rightRotate(self, z):

y = z.left
T3 = y.right

# Perform rotation
y.right = z
z.left = T3

# Update heights
z.height = 1 + max(self.getHeight(z.left),
self.getHeight(z.right))
y.height = 1 + max(self.getHeight(y.left),
self.getHeight(y.right))

# Return the new root
return y

def getHeight(self, root):
if not root:
return 0

return root.height

def getBalance(self, root):
if not root:
return 0

return self.getHeight(root.left) - self.getHeight(root.right)

def preOrder(self, root):

if not root:
return

print("{0} ".format(root.val),end=" ")
self.preOrder(root.left)
self.preOrder(root.right)


# Driver program to test above function
myTree = AVL_Tree()
root = None

root = myTree.insert(root, 10)
root = myTree.insert(root, 20)
root = myTree.insert(root, 30)
root = myTree.insert(root, 40)
root = myTree.insert(root, 50)
root = myTree.insert(root, 25)

"""The constructed AVL Tree would be
30
/ \
20 40
/ \ \
10 25 50"""

# Preorder Traversal
print("Preorder traversal of the",
"constructed AVL tree is")
myTree.preOrder(root)
print()
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ This repository contains Data structures, Algorithms and their common usecases i
* Segment Tree (For sum) (Java + Python) [Code](segment_Tree.py)
* Union Find Data Structures (Disjoint Set Data Structure) [Code](UnionFindDS.py) [Learn](Disjoint_Sets.md)
* Binary Search Tree [Code](BST.py)
* AVL Tree [Code](Avl_Tree.py)

## Learning Python ( the pythonic way)

Expand Down