Я считаю, что лучший способ обработки дополнительных данных - это создать подкласс TreeNode. Я создаю класс BaseNode, который содержит общие данные, которые я хочу сохранить, и наследую от них для любых конкретных типов узлов.
Значение подкласса заключается в том, что вы можете поддерживать строгие типы данных и сложные типы данных, как и любой другой класс ... что позволяет избежать взлома массивов в строку с разделителями каналов и т. П.
Как только у вас есть узлы на месте, он разрешает ту же прогулку по дереву, которую вы предлагаете, за исключением того, что теперь вы извлекаете значения из (скажем) BaseNode.MyData (который будут наследовать все ваши подтипы).
Одна вещь, на которую стоит обратить внимание, если вы сделаете это, хотя: вам нужно понять, насколько авторитетными вы хотите, чтобы эти узлы были. В моем случае, когда пользователь перемещается по дереву, мы проверяем кеш базы данных, чтобы убедиться, что нам не нужно повторно заполнять данные.