Skip to content

Commit eac3174

Browse files
Update AVLTree.py
1 parent 935b19a commit eac3174

File tree

1 file changed

+88
-4
lines changed

1 file changed

+88
-4
lines changed

Ch06. Trees and Tree Algorithms/AVLTree.py

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
# NOT FINISHED
2-
# delete method
3-
4-
51

62
class AVLTree:
73
def __init__(self, key = None, payload = None, parent = None, leftChild = None, rightChild = None,
@@ -45,6 +41,33 @@ def isLeftChild(self):
4541
def isRightChild(self):
4642
return self.parent.rightChild == self
4743

44+
def findMin(self):
45+
if self.hasLeftChild():
46+
return self.leftChild.findMin()
47+
else:
48+
return self
49+
50+
def findMax(self):
51+
if self.hasRightChild():
52+
return self.rightChild.findMax()
53+
else:
54+
return self
55+
56+
def get(self, key):
57+
if self.key == None:
58+
return None
59+
elif self.key == key:
60+
return self
61+
elif self.key > key:
62+
if self.hasLeftChild():
63+
return self.leftChild.get(key)
64+
else:
65+
return None
66+
elif self.key < key:
67+
if self.hasRightChild():
68+
return self.rightChild.get(key)
69+
else:
70+
return None
4871

4972
def put(self, key, payload = None):
5073
if self.key == None:
@@ -63,6 +86,54 @@ def put(self, key, payload = None):
6386
self.rightChild = AVLTree(key, payload,self)
6487
self.updateHeight(self.rightChild)
6588

89+
def delete(self,key):
90+
nodeToDelete = self.get(key)
91+
if nodeToDelete.isLeaf():
92+
if nodeToDelete.hasParent():
93+
parent = nodeToDelete.parent
94+
if nodeToDelete.isLeftChild():
95+
nodeToDelete.parent.leftChild = None
96+
parent.updateHeightAfterDeletion("left")
97+
else:
98+
nodeToDelete.parent.rightChild = None
99+
parent.updateHeightAfterDeletion("right")
100+
else:
101+
nodeToDelete = None
102+
elif nodeToDelete.hasBothChildren():
103+
maxInLeftBranch = nodeToDelete.leftChild.findMax()
104+
tmpKey = maxInLeftBranch.key
105+
tmpPayload = maxInLeftBranch.payload
106+
nodeToDelete.delete(tmpKey)
107+
nodeToDelete.key = tmpKey
108+
nodeToDelete.payload = tmpPayload
109+
elif nodeToDelete.hasLeftChild():
110+
if nodeToDelete.hasParent():
111+
parent = nodeToDelete.parent
112+
if nodeToDelete.isLeftChild():
113+
nodeToDelete.parent.leftChild = nodeToDelete.leftChild
114+
nodeToDelete.leftChild.parent = nodeToDelete.parent
115+
parent.updateHeightAfterDeletion("left")
116+
else:
117+
nodeToDelete.parent.rightChild = nodeToDelete.leftChild
118+
nodeToDelete.leftChild.parent = nodeToDelete.parent
119+
parent.updateHeightAfterDeletion("right")
120+
else:
121+
nodeToDelete.leftChild.parent = None
122+
elif nodeToDelete.hasRightChild():
123+
if nodeToDelete.hasParent():
124+
parent = nodeToDelete.parent
125+
if nodeToDelete.isLeftChild():
126+
nodeToDelete.rightChild.parent = nodeToDelete.parent
127+
nodeToDelete.parent.leftChild = nodeToDelete.rightChild
128+
parent.updateHeightAfterDeletion("left")
129+
else:
130+
nodeToDelete.rightChild.parent = nodeToDelete.parent
131+
nodeToDelete.parent.rightChild = nodeToDelete.rightChild
132+
parent.updateHeightAfterDeletion("left")
133+
else:
134+
nodeToDelete.rightChild.parent = None
135+
136+
66137
def updateHeight(self, node):
67138
if node.isLeftChild():
68139
self.leftHeight += 1
@@ -79,6 +150,19 @@ def updateHeight(self, node):
79150
if self.hasParent() and self.balanceFactor != 0:
80151
self.parent.updateHeight(self)
81152

153+
def updateHeightAfterDeletion(self, string):
154+
if string == "left":
155+
self.leftHeight -= 1
156+
elif string == "right":
157+
self.rightHeight -= 1
158+
self.balanceFactor = self.leftHeight - self.rightHeight
159+
if self.balanceFactor < -1 or self.balanceFactor > 1:
160+
self.rebalance()
161+
return
162+
163+
if self.hasParent() and self.balanceFactor != 0:
164+
self.parent.updateHeight(self)
165+
82166
def updateHeightAfterRotation(self):
83167
if self.hasLeftChild():
84168
self.leftHeight = max(self.leftChild.leftHeight, self.leftChild.rightHeight) + 1

0 commit comments

Comments
 (0)