def _remove(self, node: Node): leftChild = node.left # print(node) rightChild = node.right child = leftChild if node.left else rightChild if node is self.root: print("root") if child: #removing root while it has a single child self.root = child self.root.parent = None self.root.color = True else: self.root = None elif not node.color: if not (leftChild or rightChild): self._removeLeaf(node) else: raise Exception("BlackHeightError") else:#Node is black if leftChild: if leftChild.left or leftChild.right: raise Exception("BlackNode red child problem1") if rightChild: if rightChild.right or rightChild.left: raise Exception("BlackNode red child problem2") if child and (not child.color):#red child node.val = child.val node.left = child.left node.right = child.right else:#black child self._removeBlackNode(node)
def _recolor(self, grandParent: Node): grandParent.left.color = True grandParent.right.color = True if grandParent is not self.root: grandParent.color = False else: grandParent.color = True self._fixInsert(grandParent)
def _fixRotation(self, parent :Node, grandParent : Node, greatGrandParent : Node): parent.parent = greatGrandParent if greatGrandParent: if greatGrandParent > grandParent: greatGrandParent.left = parent else: greatGrandParent.right = parent else: self.root = parent
def _rotateRight(self, node : Node, parent : Node, grandParent: Node): greatGrandParent = grandParent.parent self._fixRotation(parent, grandParent, greatGrandParent) oldRight = parent.right parent.right = grandParent grandParent.parent = parent grandParent.left = oldRight if oldRight: oldRight.parent = grandParent
def __updateTree(self, node, letter): encodedLetter = self.lettersDictionary[letter] currentNode = node for i in range(0, len(encodedLetter)): bit = encodedLetter[i] if bit == 0: if currentNode.leftChild is None: currentNode.leftChild = Node('') currentNode = currentNode.leftChild elif bit == 1: if currentNode.rightChild is None: currentNode.rightChild = Node('') currentNode = currentNode.rightChild currentNode.setLetter(letter) return node
def __createTree(self): rootNode = Node('') uniqueCharsRepresentedInBits = self.__getUniqueLettersInWord() for letter in uniqueCharsRepresentedInBits: # letter[0], kadangi letter butu [raide, daznis] rootNode = self.__updateTree(rootNode, letter[0]) return rootNode
def insert(self, val: str): if not self.root: self.root = Node(val, None, True) self.count = 1 else: parent = self._findParent(self.root, val) if parent: newNode = Node(val, parent, False) if parent < newNode: parent.right = newNode elif parent > newNode: parent.left = newNode self._fixInsert(newNode) # to be implemented self.count += 1 else: ex = "Word "+str(val)+" already in Dict" raise Exception(ex)
def remove(self, node: Node, value): if node and value < node.val: return self.remove(node.left, value) elif node and value > node.val: return self.remove(node. right, value) elif node and value == node.val: nodeToRemove = node if node.right and node.left: suc = self._getInorderSuccessor(node) node.val = suc.val nodeToRemove = suc # print(nodeToRemove) #print(self.root) self._remove(nodeToRemove) self.count -= 1 else: return
def add_new_random_node(self, data, task, locationX,locationY): max_power = 100 min_power = 0 cpu_power = 10 ** 9 # 1GHz self.nodes.append( Node(int(data), [int(locationX),int(locationY)], int(task), max_power, min_power, cpu_power, self.model, str(self.get_size() + 1)))
def _case1(self, node: Node):#removing root//terminating case if node is self.root: node.color = True return self._case2(node=node)
def _rightRight(self,node: Node,parent: Node, grandParent: Node): self._rotateLeft(node, parent, grandParent) parent.swapColor() grandParent.swapColor()
def __createTree(self, uniqueLetters): rootNode = Node('') for letter in uniqueLetters: rootNode = self.__updateTree(rootNode, letter[1], letter[0]) return rootNode
def __createTree(self): rootNode = Node('') uniqueCharsRepresentedInBits = self.__getUniqueLettersInWord() for letter in uniqueCharsRepresentedInBits: rootNode = self.__updateTree(rootNode, letter) return rootNode