У вас у есть много вариантов здесь, и да, ваш вопрос касается распространенной ситуации, когда необходимо компромисс между эффективностью обработки, с одной стороны, с повышенными требованиями к хранилищу и возможной избыточностью, с другой.
Нет единой лучшей практики. Пространственно-временной обмен зависит от вашей ситуации. Если вы используете избыточное хранилище, сохраняя дочерние и родительские ссылки внутри узлов, вам необходимо убедиться, что ваша структура данных инкапсулирована должным образом, а ваши методы поддерживают все согласованным.
Поскольку у вас есть сценарий использования, который перемещается к узлам сверху, родительские ссылки работают нормально, и вы можете составить полное имя с помощью рекурсии или построения строки сзади-вперед. Поскольку сценарий использования подходит для вашей ситуации, это неплохая идея.
Другой вариант - сохранить полное имя в узле, но это добавляет избыточность в случае перемещения узлов.
Короче говоря, вам не нужно беспокоиться о нарушении лучших практик, но вы должны взвесить все варианты, чтобы сделать выбор, который подходит именно вам.
Теперь, если вы создавали древовидную структуру данных общего назначения, такую как TreeNode в Java, вы, вероятно, создали бы интерфейс и позволили бы людям реализовывать вещи по своему усмотрению, обеспечивая подходящую общую реализацию (DefaultMutableTreeNode), которая имеет все ссылки. - родитель, ребенок и родной брат.