I would consider an alternative if you are fine with randomized data structures: Skip Lists.
From a high-level point of view, it's a tree structure, except that it's not implemented as a tree but as a list with multiple layers of links.
You'll get O(log N) insertions / searches / deletes, and you won't have to deal with all those tricky rebalancing cases.
I've never considered implementing them in a Functional Language though, and the wikipedia page does not show any, so it may not be easy (wrt to immutability)