private void fixDoubleRed(Node child){
      Node parent = child.parent;      
      Node grandParent = parent.parent;
      if (grandParent == null) { parent.color = black; return; }
      Node n1, n2, n3, t1, t2, t3, t4;
      if (parent == grandParent.left){
         n3 = grandParent; t4 = grandParent.right;
         if (child == parent.left){
            n1 = child; n2 = parent;
            t1 = child.left; t2 = child.right; t3 = parent.right;
         }else{
            n1 = parent; n2 = child;
            t1 = parent.left; t2 = child.left; t3 = child.right;
         }
      }else{
         n1 = grandParent; t1 = grandParent.left;
         if (child == parent.left){
            n2 = child; n3 = parent;
            t2 = child.left; t3 = child.right; t4 = parent.right;
         }else{
            n2 = parent; n3 = child;
            t2 = parent.left; t3 = child.left; t4 = child.right;
         }        
      }
     
      if (grandParent == root){
         root = n2;
         n2.parent = null;
      }else{grandParent.replaceWith(n2);}
     
      n1.setLeftChild(t1);
      n1.setRightChild(t2);
      n2.setLeftChild(n1);
      n2.setRightChild(n3);
      n3.setLeftChild(t3);
      n3.setRightChild(t4);
      n2.color = grandParent.color - 1;
      n1.color = black;
      n3.color = black;

      if (n2 == root){root.color = black;}
      else if (n2.color == red && n2.parent.color == red){fixDoubleRed(n2);}
   }