Move the selection to the previous sibling if it can't go to the next
or the parent.
Fix the selection change logic.

diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index a645f43..1c1caec 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -1440,8 +1440,7 @@
 static LRESULT
 TREEVIEW_DeleteItem(TREEVIEW_INFO *infoPtr, HTREEITEM wineItem)
 {
-    TREEVIEW_ITEM *oldSelection = infoPtr->selectedItem;
-    TREEVIEW_ITEM *newSelection = oldSelection;
+    TREEVIEW_ITEM *newSelection = NULL;
     TREEVIEW_ITEM *newFirstVisible = NULL;
     TREEVIEW_ITEM *parent, *prev = NULL;
     BOOL visible = FALSE;
@@ -1476,6 +1475,9 @@
 		newSelection = wineItem->nextSibling;
 	    else if (wineItem->parent != infoPtr->root)
 		newSelection = wineItem->parent;
+            else
+                newSelection = wineItem->prevSibling;
+            TRACE("newSelection = %p\n", newSelection);
 	}
 
 	if (infoPtr->firstVisible == wineItem)
@@ -1494,13 +1496,11 @@
 	TREEVIEW_RemoveItem(infoPtr, wineItem);
     }
 
-    /* Don't change if somebody else already has. */
-    if (oldSelection == infoPtr->selectedItem)
+    /* Don't change if somebody else already has (infoPtr->selectedItem is cleared by FreeItem). */
+    if (!infoPtr->selectedItem && newSelection)
     {
 	if (TREEVIEW_ValidItem(infoPtr, newSelection))
 	    TREEVIEW_DoSelectItem(infoPtr, TVGN_CARET, newSelection, TVC_UNKNOWN);
-	else
-	    infoPtr->selectedItem = 0;
     }
 
     /* Validate insertMark dropItem.