366 if (
newNode->getParent () ==
nullptr)
371 if (
newNode->getParent ()->getParent () ==
nullptr)
407 while (node !=
nullptr)
409 if (node->getValue () < size)
411 node = node->getRight ();
413 else if (node->getValue () > size)
416 node = node->getLeft ();
436 if (node->getValue () >=
limit)
441 if (node->hasList ())
444 size = node->getValue ();
448 size = node->getValue ();
486 if (m_root ==
nullptr)
495 while (node !=
nullptr)
499 node = node->getLeft ();
501 else if (
value > node->getValue ())
503 node = node->getRight ();
513 node = node->getNext ();
515 while (node !=
nullptr);
538 if (node->isInList () || node->hasList ())
544 if (node->getRight () !=
nullptr)
546 return newValue < getLeftMostNode (node->getRight ())->getValue ();
566 return m_root ==
nullptr;
579 else if (oldChildNode == parentNode->getLeft ())
581 parentNode->setLeft (newChildNode);
583 else if (oldChildNode == parentNode->getRight ())
585 parentNode->setRight (newChildNode);
589 COOKMEM_ASSERT (
false);
591 if (newChildNode !=
nullptr)
593 newChildNode->setParent (parentNode);
600 while (node->getLeft () !=
nullptr)
602 node = node->getLeft ();
616 if (m_root ==
nullptr)
625 if (key < node->getValue ())
627 if (node->getLeft () ==
nullptr)
633 node = node->getLeft ();
636 else if (key > node->getValue ())
638 if (node->getRight () ==
nullptr)
644 node = node->getRight ();
657 while (node != m_root &&
658 node->getParent ()->isRed ())
660 NodeType* grandParentNode = node->getParent ()->getParent ();
661 if (node->getParent () == grandParentNode->getLeft ())
663 NodeType* uncleNode = grandParentNode->getRight ();
664 if (uncleNode !=
nullptr &&
667 uncleNode->setRed (
false);
668 node->getParent ()->setRed (
false);
669 grandParentNode->setRed (
true);
670 node = node->getParent ()->getParent ();
674 if (node == node->getParent ()->getRight ())
676 node = node->getParent ();
677 doLeftRotation(node);
679 node->getParent ()->setRed (
false);
680 node->getParent ()->getParent ()->setRed (
true);
681 doRightRotation (node->getParent ()->getParent ());
686 NodeType* uncleNode = grandParentNode->getLeft ();
687 if (uncleNode !=
nullptr &&
690 uncleNode->setRed (
false);
691 node->getParent ()->setRed (
false);
692 grandParentNode->setRed (
true);
693 node = node->getParent ()->getParent ();
697 if (node == node->getParent ()->getLeft ())
699 node = node->getParent ();
700 doRightRotation (node);
702 node->getParent ()->setRed (
false);
703 node->getParent ()->getParent ()->setRed (
true);
704 doLeftRotation (node->getParent ()->getParent ());
714 m_root->setRed (
false);
720 if (node->hasList ())
724 NodeType* replacementNode = node->promoteFirstListNode ();
725 if (replacementNode->getLeft () !=
nullptr)
727 replacementNode->getLeft ()->setParent (replacementNode);
729 if (replacementNode->getRight () !=
nullptr)
731 replacementNode->getRight ()->setParent (replacementNode);
733 updateParent (replacementNode, node);
738 bool replacementWasRed = replacementNode->isRed ();
742 if (node->getLeft () ==
nullptr)
744 childNode = node->getRight ();
745 childParentNode = node->getParent ();
746 updateParent (childNode, node);
748 else if (node->getRight () ==
nullptr)
750 childNode = node->getLeft ();
751 childParentNode = node->getParent ();
752 updateParent (childNode, node);
756 replacementNode = getLeftMostNode (node->getRight ());
757 replacementWasRed = replacementNode->isRed ();
758 childNode = replacementNode->getRight ();
760 if (replacementNode->getParent () == node)
762 childParentNode = replacementNode;
763 if (childNode !=
nullptr)
765 childNode->setParent (replacementNode);
770 childParentNode = replacementNode->getParent ();
771 updateParent (childNode, replacementNode);
772 replacementNode->setRight (node->getRight ());
773 replacementNode->getRight ()->setParent (replacementNode);
776 updateParent (replacementNode, node);
777 replacementNode->setLeft (node->getLeft ());
778 replacementNode->getLeft ()->setParent (replacementNode);
779 replacementNode->setRed (node->isRed ());
782 if (!replacementWasRed)
784 balanceRemove (childNode, childParentNode);
786 if (childNode !=
nullptr)
788 childNode->setRed (
false);
790 if (m_root !=
nullptr)
792 m_root->setRed (
false);
799 return node ==
nullptr || !node->isRed ();
805 while (node != m_root && isBlack (node))
807 if (parentNode ==
nullptr)
812 if (node == parentNode->getLeft ())
814 NodeType* siblingNode = parentNode->getRight ();
815 if (siblingNode !=
nullptr && siblingNode->isRed ())
817 siblingNode->setRed (
false);
818 parentNode->setRed (
true);
819 doLeftRotation (parentNode);
820 siblingNode = parentNode->getRight ();
823 if (siblingNode ==
nullptr ||
824 (isBlack (siblingNode->getLeft ()) &&
825 isBlack (siblingNode->getRight ())))
827 if (siblingNode !=
nullptr)
829 siblingNode->setRed (
true);
832 parentNode = node->getParent ();
836 if (isBlack (siblingNode->getRight ()))
838 if (siblingNode->getLeft () !=
nullptr)
840 siblingNode->getLeft ()->setRed (
false);
842 siblingNode->setRed (
true);
843 doRightRotation (siblingNode);
844 siblingNode = parentNode->getRight ();
846 siblingNode->setRed (parentNode->isRed ());
847 parentNode->setRed (
false);
848 if (siblingNode->getRight () !=
nullptr)
850 siblingNode->getRight ()->setRed (
false);
852 doLeftRotation (parentNode);
854 parentNode =
nullptr;
859 NodeType* siblingNode = parentNode->getLeft ();
860 if (siblingNode !=
nullptr && siblingNode->isRed ())
862 siblingNode->setRed (
false);
863 parentNode->setRed (
true);
864 doRightRotation (parentNode);
865 siblingNode = parentNode->getLeft ();
868 if (siblingNode ==
nullptr ||
869 (isBlack (siblingNode->getLeft ()) &&
870 isBlack (siblingNode->getRight ())))
872 if (siblingNode !=
nullptr)
874 siblingNode->setRed (
true);
877 parentNode = node->getParent ();
881 if (isBlack (siblingNode->getLeft ()))
883 if (siblingNode->getRight () !=
nullptr)
885 siblingNode->getRight ()->setRed (
false);
887 siblingNode->setRed (
true);
888 doLeftRotation (siblingNode);
889 siblingNode = parentNode->getLeft ();
891 siblingNode->setRed (parentNode->isRed ());
892 parentNode->setRed (
false);
893 if (siblingNode->getLeft () !=
nullptr)
895 siblingNode->getLeft ()->setRed (
false);
897 doRightRotation (parentNode);
899 parentNode =
nullptr;
906 node->setRed (
false);
930 NodeType* nodeC = nodeA->getRight ();
932 NodeType* nodeD = nodeC->getLeft ();
933 nodeA->setRight (nodeD);
934 if (nodeD !=
nullptr)
936 nodeD->setParent (nodeA);
939 updateParent (nodeC, nodeA);
941 nodeC->setLeft (nodeA);
942 nodeA->setParent (nodeC);
965 NodeType* nodeB = nodeA->getLeft ();
967 NodeType* nodeE = nodeB->getRight ();
968 nodeA->setLeft (nodeE);
969 if (nodeE !=
nullptr)
971 nodeE->setParent (nodeA);
974 updateParent (nodeB, nodeA);
976 nodeB->setRight (nodeA);
977 nodeA->setParent (nodeB);