14.5.1 Step 2: Delete |
The actual deletion step is derived from that for PBSTs. We add code to modify balance factors and set up for rebalancing. After the deletion, q is the node at which balance factors must be updated and possible rebalancing occurs and dir is the side of q from which the node was deleted. This follows the pattern already seen in TAVL deletion (see Deleting a TAVL Node Step 2 - Delete).
537. <Step 2: Delete item from PAVL tree 537> = if (p->pavl_link[1] == NULL) {
<Case 1 in PAVL deletion 538>
} else
{ struct pavl_node *r = p->pavl_link[1]; if (r->pavl_link[0] == NULL) {
<Case 2 in PAVL deletion 539>
} else
{
<Case 3 in PAVL deletion 540>
} } tree->pavl_alloc->libavl_free (tree->pavl_alloc, p);
This code is included in 536.
No changes are needed for case 1. No balance factors need change and q and dir are already set up correctly.
538. <Case 1 in PAVL deletion 538> = <Case 1 in PBST deletion; pbst => pavl 499>
This code is included in 537.
See the commentary on <Case 3 in TAVL deletion 318> for details.
539. <Case 2 in PAVL deletion 539> = <Case 2 in PBST deletion; pbst => pavl 500> r->pavl_balance = p->pavl_balance; q = r; dir = 1;
This code is included in 537.
See the commentary on <Case 4 in TAVL deletion 319> for details.
540. <Case 3 in PAVL deletion 540> = <Case 3 in PBST deletion; pbst => pavl 501> s->pavl_balance = p->pavl_balance; q = r; dir = 0;
This code is included in 537.