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 96bdf64

Browse files
Merge pull request fnplus#588 from Shreyansh0001/master
Created AVL Tree for python
2 parents cae17a2 + a6b7552 commit 96bdf64

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed

‎Data Structures/AVL Tree/Avltree.py‎

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

0 commit comments

Comments
(0)

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