Иногда помогает рассмотрение проблемы с другой точки зрения.
Почему бы вам сначала не изменить логику того, как дерево управляет проверкой элементов, если это возможно:
Если пользователь проверяет элемент, вы не удалите ни элемент, ни его родителей. Поэтому, когда пользователь проверяет элемент, проверяйте каждый элемент вверх по дереву, пока не дойдете до корневого элемента выбранного элемента. Это легко реализовать.
Теперь, когда вы подрезаете, вам нужно просто пройти по дереву (начиная с корневых элементов и спускаясь по дереву) в поисках непроверенных элементов. Вы можете удалить их и, следовательно, все предметы, висящие на нем, не глядя, есть ли выбранные предметы в этой ветви.
Возможно, эта опция недопустима из-за ваших требований.