1- # NOT FINISHED
2- # delete method
3-
4-
51
62class 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