Вот tree.hh , что немного близко к тому, что вы хотите сделать, хотя и немного
отличается.
Вот фрагмент кода, извлеченный с его сайта.
int main(int, char **)
{
tree<string> tr;
tree<string>::iterator top, one, two, loc, banana;
top=tr.begin();
one=tr.insert(top, "one");
two=tr.append_child(one, "two");
tr.append_child(two, "apple");
banana=tr.append_child(two, "banana");
tr.append_child(banana,"cherry");
tr.append_child(two, "peach");
tr.append_child(one,"three");
loc=find(tr.begin(), tr.end(), "two");
if(loc!=tr.end()) {
tree<string>::sibling_iterator sib=tr.begin(loc);
while(sib!=tr.end(loc)) {
cout << (*sib) << endl;
++sib;
}
cout << endl;
tree<string>::iterator sib2=tr.begin(loc);
tree<string>::iterator end2=tr.end(loc);
while(sib2!=end2) {
for(int i=0; i<tr.depth(sib2)-2; ++i)
cout << " ";
cout << (*sib2) << endl;
++sib2;
}
}
}
Теперь, что отличается? Ваша реализация проще, когда дело доходит до
добавить узел в дерево.
Хотя ваша версия, несомненно, проще, разработчик этой библиотеки, вероятно, хотел, чтобы некоторая информация была доступна без просмотра дерева, например, размер дерева.
Я также предполагаю, что он не хотел хранить корень на всех узлах по соображениям производительности.
Так что, если вы хотите реализовать его по-своему, я предлагаю вам сохранить большую часть логики и добавить ссылку на родительское дерево в итераторе и переписать с добавлением немного.