A AVL Tree that contains key/value pairs that are in , but not in

Pseudocode

diff(T1, T2):
    if T1 is empty: return empty
    if T2 is empty: return T1
 
    // Use T2's root as pivot
    let (L2, _, R2) = expose(T2)   // left subtree, root key k2, right subtree
    k2 = root key of T2
 
    let (L1, b, R1) = split(T1, k2)
    // L1 = T1 keys < k2,  R1 = T1 keys > k2
    // b = whether k2 ∈ T1 (we discard it — k2 is in T2)
 
    left  = diff(L1, L2)
    right = diff(R1, R2)
 
    return join2(left, right)      // join without a middle key