Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
 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
Пример #6
0
 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
Пример #7
0
    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)
Пример #8
0
 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
Пример #9
0
 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)))
Пример #10
0
 def _case1(self, node: Node):#removing root//terminating case
     if node is self.root:
         node.color = True
         return
     self._case2(node=node)
Пример #11
0
 def _rightRight(self,node: Node,parent: Node, grandParent: Node):
     self._rotateLeft(node, parent, grandParent)
     parent.swapColor()
     grandParent.swapColor()
Пример #12
0
 def __createTree(self, uniqueLetters):
     rootNode = Node('')
     for letter in uniqueLetters:
         rootNode = self.__updateTree(rootNode, letter[1], letter[0])
     return rootNode
Пример #13
0
 def __createTree(self):
     rootNode = Node('')
     uniqueCharsRepresentedInBits = self.__getUniqueLettersInWord()
     for letter in uniqueCharsRepresentedInBits:
         rootNode = self.__updateTree(rootNode, letter)
     return rootNode