Eliminar un elemento de un árbol de búsqueda binario en F #
Estoy tratando de escribir un método para eliminar un elemento de un BST. Hasta ahora, esto es lo que tengo. No estoy seguro de si estoy en el camino correcto o si hay una mejor manera de hacerlo mediante la coincidencia de patrones para que coincida con los diferentes casos de eliminación, es decir: sin hijos, 1 hijo, 2 niños.
type 'a bst = NL | BinTree of 'a * 'a bst * 'a bst;;
let rec smallest = function
| NL -> failwith "tree is empty"
| BinTree(m, lst, rst) -> if lst = NL then BinTree(m, lst, rst)
else smallest lst;;
let rec smallest2 = function
| NL -> failwith "tree is empty"
| BinTree(m, lst, rst) -> if lst = NL then m
else smallest2 lst;;
let rec rem2 = function
| NL -> NL
| BinTree(m, NL, NL) -> NL
| BinTree(m, NL, rst) -> rst
| BinTree(m, lst, NL) -> lst
| BinTree(m, lst, rst) -> BinTree(smallest2 rst, lst, rst);;
let rec rem x = function
|NL -> failwith "Node doesn't exit"
|BinTree(m, lst, rst) -> if m = x then rem2 (BinTree(m, lst, rst))
elif m < x then BinTree(m, lst, rem x rst)
else BinTree(m, rem x lst, rst);;
Los casos de sin hijos y de un solo hijo funcionan perfectamente, pero cuando el nodo que se va a eliminar tiene 2 hijos, no puedo entender cómo implementar este caso. Quiero reemplazar el valor de ese nodo con el elemento más pequeño en su subárbol derecho, y luego eliminar el elemento más pequeño en su subárbol derecho.