While the TreeView itself does not expose any events that indicate that the user has changed the structure of the tree, the TreeView control wraps a TreeViewList control. That control does expose drag events, like DragItemStarting. So the solution is to do this:
<Style TargetType="TreeView">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeView">
<TreeViewList x:Name="ListControl"
DragItemsCompleted="DragItemsCompleted"
CanDragItems="True"
AllowDrop="True"
CanReorderItems="True">
Thanks to Sunteen Wu from Microsoft for the answer!