When you say use a delete trigger as opposed to a recursive CTE, I assume you are going to do some kind of loop in the trigger, which would mean the CTE would be more efficient.
For a CTE, try something like:
with cte as (
select id as root, parent, id
from [<YourTable>]
where parent is null -- This selects root nodes
union all
select cte.root, d.parent, d.id
from cte
inner join data d on cte.id = d.parent
)
delete from [<YourTable>]
from [<YourTable>]
inner join cte on rel.id = cte.id
where cte.root = 1 -- This is the root to delete