code: private void deleteEntry(TreeMapEntry<K,V> p) {
          modCount++;
          size--;
  
          // If strictly internal, copy successor's element to p and then make p
          // point to successor.
          if (p.left != null && p.right != null) {
              TreeMapEntry<K,V> s = successor(p);
              p.key = s.key;
              p.value = s.value;
              p = s;
          } // p has 2 children
  
          // Start fixup at replacement node, if it exists.
          TreeMapEntry<K,V> replacement = (p.left != null ? p.left : p.right);
  
          if (replacement != null) {
              // Link replacement to parent
              replacement.parent = p.parent;
              if (p.parent == null)
                  root = replacement;
              else if (p == p.parent.left)
                  p.parent.left  = replacement;
              else
                  p.parent.right = replacement;
  
              // Null out links so they are OK to use by fixAfterDeletion.
              p.left = p.right = p.parent = null;
  
              // Fix replacement
              if (p.color == BLACK)
                  fixAfterDeletion(replacement);
          } else if (p.parent == null) { // return if we are the only node.
              root = null;
          } else { //  No children. Use self as phantom replacement and unlink.
              if (p.color == BLACK)
                  fixAfterDeletion(p);
  
              if (p.parent != null) {
                  if (p == p.parent.left)
                      p.parent.left = null;
                  else if (p == p.parent.right)
                      p.parent.right = null;
                  p.parent = null;
              }
          }
      }
docs: Delete node p, and then rebalance the tree.