Что ж, для вас уже многое сделано, в некотором смысле, потому что корни, листья и другие уже изначально определены в API дерева. Вы можете вызывать is_root () и is_leaf () на отдельных узлах, чтобы различать их.
Листья и промежуточные объекты могут относиться к объектам одного и того же типа и содержать данные одного и того же типа в зависимости от способа интерпретации и использования данных приложением в зависимости от тестирования is_leaf ().
Корни являются чем-то особенным ... они могут содержать информацию, относящуюся ко всему дереву, и вам может понадобиться простой способ поиска определенных корней и хранения дополнительных данных. Вы можете сделать это с моделью, которая имеет отношение один к одному с корневым узлом (возможно, с перегруженным методом сохранения и проверкой, чтобы убедиться, что узел указывает на is_root () перед разрешением сохранения).
В целом, я хочу сказать, что вам не нужно слишком увлекаться, чтобы делать то, что вы хотите. Различие, которое вы проводите, уже заложено в концепции дерева и его API, и вы, вероятно, могли бы реализовать различное поведение с одними и теми же базовыми данными, проверив контекст узла.