Não é mais difícil.
Com listas duplamente vinculadas, quando você insere, alocará memória e, em seguida, vinculará à cabeça ou ao nó anterior e à cauda ou ao nó seguinte. Ao excluir, você desvinculará exatamente da mesma e liberará memória. Todas essas operações são simétricas.
Isso pressupõe que, nos dois casos, você tenha o nó para inserir / excluir. (E, no caso da inserção, que você também tem o nó para inserir antes, de certa forma, a inserção pode ser considerada um pouco mais complicada.) Se você estiver tentando excluir, não tendo o nó a excluir, mas a carga útil do nó, é claro que você terá que pesquisar primeiro na lista a carga útil, mas isso não é uma falha de exclusão, é?
Com árvores balanceadas, o mesmo se aplica: uma árvore geralmente precisa ser balanceada imediatamente após uma inserção e também imediatamente após uma exclusão. É uma boa idéia tentar ter apenas uma rotina de balanceamento e aplicá-la após cada operação, independentemente de se tratar de uma inserção ou exclusão. Se você está tentando implementar uma inserção que sempre deixa a árvore equilibrada e também uma exclusão que sempre a deixa equilibrada, sem que os dois compartilhem a mesma rotina de equilíbrio, você está desnecessariamente complicando sua vida.
Em suma, não há razão para que um seja mais difícil que o outro, e se você estiver descobrindo que é, é possível que você seja vítima da tendência (muito humana) de achar mais natural pensar de forma construtiva e subtraída, o que significa que você pode estar implementando a exclusão de uma maneira mais complicada do que precisa. Mas isso é uma questão humana. Do ponto de vista matemático, não há problema.
pop
,extract-min
?