protected void fixAfterInsertion(Node<T> node) {
    while (getColor(node.getParent()) == NodeColor.RED) {
      if (node.getParent() == node.getParent().getParent().getLeft()) {
        Node<T> temp = node.getParent().getParent().getRight();
        if (getColor(temp) == NodeColor.RED) {
          setColor(node.getParent(), (NodeColor.BLACK));
          setColor(temp, NodeColor.BLACK);
          setColor(node.getParent().getParent(), NodeColor.RED);
          node = node.getParent().getParent();
        } else {
          if (node == node.getParent().getRight()) {
            node = node.getParent();
            leftRotate(node);
          }
          setColor(node.getParent(), NodeColor.BLACK);
          setColor(node.getParent().getParent(), NodeColor.RED);
          rightRotate(node.getParent().getParent());
        }
      } else {
        Node<T> temp = node.getParent().getParent().getLeft();
        if (getColor(temp) == NodeColor.RED) {
          setColor(node.getParent(), NodeColor.BLACK);
          setColor(temp, NodeColor.BLACK);
          setColor(node.getParent().getParent(), NodeColor.RED);
          node = node.getParent().getParent();
        } else {
          if (node == node.getParent().getLeft()) {
            node = node.getParent();
            rightRotate(node);
          }
          setColor(node.getParent(), NodeColor.BLACK);
          setColor(node.getParent().getParent(), NodeColor.RED);
          leftRotate(node.getParent().getParent());
        }
      }
    }
    setColor(root, NodeColor.BLACK);
  }