Пример #1
0
 /**
  * Delete node by key in sub tree. Returns node from which we start
  * @param Node $node
  * @param KeyInterface $key
  * @return Node
  */
 private function _delete(Node $node, KeyInterface $key) : Node
 {
     if (!$node->getLength()) {
         return new Node(new Key(''), null);
     }
     $cmp = $node->getKey()->compare($key);
     if ($cmp > 0) {
         $node->setLeft($this->_delete($node->getLeft(), $key));
     } else {
         if ($cmp < 0) {
             $node->setRight($this->_delete($node->getRight(), $key));
         } else {
             if (!$node->getRight()->getLength()) {
                 // if node have empty right link replace it with his left link
                 return $node->getLeft();
             }
             if (!$node->getLeft()->getLength()) {
                 // if node have empty left link replace it with his right link
                 return $node->getRight();
             }
             // save link
             $tmp = $node;
             // get min node in right branch
             $node = $this->_min($tmp->getRight());
             // delete min node in tree and set right link in min node with right branch of deleted node
             $node->setRight($this->_deleteMin($tmp->getRight()));
             // set left link in min node with left branch of deleted node
             $node->setLeft($tmp->getLeft());
         }
     }
     return $node;
 }
Пример #2
0
 private function rotateRight(Node $node) : Node
 {
     $tmp = $node->getLeft();
     $node->setLeft($tmp->getRight());
     $tmp->setRight($node);
     $tmp->setColor($node->getColor());
     $node->setColor(Node::RED);
     return $tmp;
 }