Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 948e0e0

Browse files
Create Avl.py
1 parent f36b5e2 commit 948e0e0

File tree

1 file changed

+139
-0
lines changed
  • Data Structures/AVL Tree

1 file changed

+139
-0
lines changed

‎Data Structures/AVL Tree/Avl.py‎

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
2+
# Generic tree node class
3+
class TreeNode(object):
4+
def __init__(self, val):
5+
self.val = val
6+
self.left = None
7+
self.right = None
8+
self.height = 1
9+
10+
# AVL tree class which supports the
11+
# Insert operation
12+
class AVL_Tree(object):
13+
14+
# Recursive function to insert key in
15+
# subtree rooted with node and returns
16+
# new root of subtree.
17+
def insert(self, root, key):
18+
19+
# Step 1 - Perform normal BST
20+
if not root:
21+
return TreeNode(key)
22+
elif key < root.val:
23+
root.left = self.insert(root.left, key)
24+
else:
25+
root.right = self.insert(root.right, key)
26+
27+
# Step 2 - Update the height of the
28+
# ancestor node
29+
root.height = 1 + max(self.getHeight(root.left),
30+
self.getHeight(root.right))
31+
32+
# Step 3 - Get the balance factor
33+
balance = self.getBalance(root)
34+
35+
# Step 4 - If the node is unbalanced,
36+
# then try out the 4 cases
37+
# Case 1 - Left Left
38+
if balance > 1 and key < root.left.val:
39+
return self.rightRotate(root)
40+
41+
# Case 2 - Right Right
42+
if balance < -1 and key > root.right.val:
43+
return self.leftRotate(root)
44+
45+
# Case 3 - Left Right
46+
if balance > 1 and key > root.left.val:
47+
root.left = self.leftRotate(root.left)
48+
return self.rightRotate(root)
49+
50+
# Case 4 - Right Left
51+
if balance < -1 and key < root.right.val:
52+
root.right = self.rightRotate(root.right)
53+
return self.leftRotate(root)
54+
55+
return root
56+
57+
def leftRotate(self, z):
58+
59+
y = z.right
60+
T2 = y.left
61+
62+
# Perform rotation
63+
y.left = z
64+
z.right = T2
65+
66+
# Update heights
67+
z.height = 1 + max(self.getHeight(z.left),
68+
self.getHeight(z.right))
69+
y.height = 1 + max(self.getHeight(y.left),
70+
self.getHeight(y.right))
71+
72+
# Return the new root
73+
return y
74+
75+
def rightRotate(self, z):
76+
77+
y = z.left
78+
T3 = y.right
79+
80+
# Perform rotation
81+
y.right = z
82+
z.left = T3
83+
84+
# Update heights
85+
z.height = 1 + max(self.getHeight(z.left),
86+
self.getHeight(z.right))
87+
y.height = 1 + max(self.getHeight(y.left),
88+
self.getHeight(y.right))
89+
90+
# Return the new root
91+
return y
92+
93+
def getHeight(self, root):
94+
if not root:
95+
return 0
96+
97+
return root.height
98+
99+
def getBalance(self, root):
100+
if not root:
101+
return 0
102+
103+
return self.getHeight(root.left) - self.getHeight(root.right)
104+
105+
def preOrder(self, root):
106+
107+
if not root:
108+
return
109+
110+
print("{0} ".format(root.val), end="")
111+
self.preOrder(root.left)
112+
self.preOrder(root.right)
113+
114+
115+
# Driver program to test above function
116+
myTree = AVL_Tree()
117+
root = None
118+
119+
root = myTree.insert(root, 10)
120+
root = myTree.insert(root, 20)
121+
root = myTree.insert(root, 30)
122+
root = myTree.insert(root, 40)
123+
root = myTree.insert(root, 50)
124+
root = myTree.insert(root, 25)
125+
126+
"""The constructed AVL Tree would be
127+
30
128+
/ \
129+
20 40
130+
/ \ \
131+
10 25 50"""
132+
133+
# Preorder Traversal
134+
print("Preorder traversal of the",
135+
"constructed AVL tree is")
136+
myTree.preOrder(root)
137+
print()
138+
139+
# This code is contributed by Ajitesh Pathak

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /