/** * 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; }
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; }