Например, как это сделано в одной из реализаций STL:
1) end_node - специальная нода, которая является parent-ом root ноды.
2) root является left child-ом end_node-ы (parent и right child у end_node-ы нулевые).
3) Благодаря перечисленным выше свойствам при итерировании до конца мы будем приходить в end_node.
4) reverse_iterator - отдельный тип, конструируется из обычного итератора, но ведёт себя следующим образом:
- хранит в себе обычный итератор
- при обращении - возвращает предыдущий итератор (копирует обычный, зовёт -- у обычного, возвращает то что получилось)
- инвертирует операции ++, --, +=, -=
5) соответственно rend получается из begin()-а, а rbegin() из end()-а.