дерево это условно список указателей
пусть item := tree[i]
FreeAndNil(item) === item.Free; item := nil;
в tree[i] как был старый указатель, так и есть. Если к нему обратиться, в лучшем случае будет ошибка. В худшем - что-то попортится и все упадет совсем.
Parent содержит ссылку на child поэтому перед тем как разрушить child, неплохо бы чтобы parent эту ссылку потерял, там вроде был механизм, что во время присваивания Parent, от старого Parent мы отцепляемся. Могу наврать.
В любом случае есть же штатный метод удаления узла, нужно просто посмотреть в код TreeView и найти его. Там все уже учтено.