I am trying to implement a BTree in a pointer-free language as a proof-of-concept. However, a question came to my mind: every time I need to split a node, I need to do a deep copy of all the nodes in the (new) left sub-tree and right sub-trees, thus (I think) destroying the advantages of using a BTree. If I had pointers, I would just point the new root to each of the new half nodes. Is that correct?
Also, I thought about trying to replicate the pointer behavior by having keys to be integers which are a list index, and that list would contain all nodes, representing a disk, for example. Although that would also destroy the advantages of a BTree, I could implement some data type that is equivalent to a list, but is written on the disk, and then everything would be ok. Is that right?