I knew there was interest in that question.
Finally I've redesign everything. What I haven't told is that my tree was supposed to represent rows in a postgres table. Each row has a foreign key pointing to the same table to represent its father (except for root). At first I wanted to load the whole tree, make the change on it and applied it to the database so if you wanted to cancel something in the process, the change would not have been made in the DB. Instead I decided to use the database properties like a transaction and delete on cascade. If the user decide to cancel everything, I rollback and no changes are made in the DB and if he decide to save, the commit is made. Also easy when you want to delete a subtree, you just have to delete its root and on cascade, everything pointing to it will be deleted. No recursive functions except for loading the tree. Eventually, if i have time, I could implement the Command pattern to have a undo/redo, but at the moment it's just a nice to have.
Now I see the use of my software conception class and that all the time spent on my class diagram is not lost.