#include <algorithm>
#include <iostream>
#include <vector>
template <typename T> class foo
{
T attribute1;
std::vector<foo*> attribute2;
public:
foo(const T& data):attribute1(data){}
// Some methods
foo* getAttribute2(int pos)const
{
if (pos<0 || pos>=attribute2.size())
throw "In foo::getAttribute2, argument out of range";
return attribute2[pos];
}
void append(foo<T>* element) {attribute2.push_back(element);}
void foo2vector(std::vector<T>& v) const
{
v.push_back(attribute1);
if (attribute2.size()>0)
{
for(int i=0; i<attribute2.size();i++)
attribute2[i]->foo2vector(v);
}
}
void display3()const
{
std::vector<T> v;
foo2vector(v);
std::reverse(v.begin(),v.end());
for (int i=0;i<v.size();i++)
std::cout<<v[i]<<"\t";
}
};
int main()
{
foo<int>* root=new foo<int>(12);
root->append(new foo<int>(8)); // node 0
root->append(new foo<int>(23)); // node 1
// Sons of node 0
(root->getAttribute2(0))->append(new foo<int>(4));
(root->getAttribute2(0))->append(new foo<int>(9));
// Sons of node 1
(root->getAttribute2(1))->append(new foo<int>(17)); // node 4
root->display3();
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIGZvbwp7CiAgVCBhdHRyaWJ1dGUxOwogIHN0ZDo6dmVjdG9yPGZvbyo+IGF0dHJpYnV0ZTI7ICAKCiBwdWJsaWM6CiAgZm9vKGNvbnN0IFQmIGRhdGEpOmF0dHJpYnV0ZTEoZGF0YSl7fQoKICAvLyBTb21lIG1ldGhvZHMKCiAgZm9vKiBnZXRBdHRyaWJ1dGUyKGludCBwb3MpY29uc3QKICB7CiAgICBpZiAocG9zPDAgfHwgcG9zPj1hdHRyaWJ1dGUyLnNpemUoKSkgCiAgICAgICAgdGhyb3cgIkluIGZvbzo6Z2V0QXR0cmlidXRlMiwgYXJndW1lbnQgb3V0IG9mIHJhbmdlIjsKICAgIHJldHVybiBhdHRyaWJ1dGUyW3Bvc107Cn0gCiAgdm9pZCBhcHBlbmQoZm9vPFQ+KiBlbGVtZW50KSB7YXR0cmlidXRlMi5wdXNoX2JhY2soZWxlbWVudCk7fQoKICB2b2lkIGZvbzJ2ZWN0b3Ioc3RkOjp2ZWN0b3I8VD4mIHYpIGNvbnN0CiAgewogICAgdi5wdXNoX2JhY2soYXR0cmlidXRlMSk7CiAgICBpZiAoYXR0cmlidXRlMi5zaXplKCk+MCkgCiAgICB7CiAgICAgICAgZm9yKGludCBpPTA7IGk8YXR0cmlidXRlMi5zaXplKCk7aSsrKSAKICAgICAgICAgICAgYXR0cmlidXRlMltpXS0+Zm9vMnZlY3Rvcih2KTsKICAgIH0KICB9Cgp2b2lkIGRpc3BsYXkzKCljb25zdAp7CiAgICBzdGQ6OnZlY3RvcjxUPiB2OwogICAgZm9vMnZlY3Rvcih2KTsKICAgIHN0ZDo6cmV2ZXJzZSh2LmJlZ2luKCksdi5lbmQoKSk7CiAgICBmb3IgKGludCBpPTA7aTx2LnNpemUoKTtpKyspCiAgICAgICAgc3RkOjpjb3V0PDx2W2ldPDwiXHQiOwp9Cgp9OwoKaW50IG1haW4oKQp7CmZvbzxpbnQ+KiByb290PW5ldyBmb288aW50PigxMik7CnJvb3QtPmFwcGVuZChuZXcgZm9vPGludD4oOCkpOyAvLyBub2RlIDAKcm9vdC0+YXBwZW5kKG5ldyBmb288aW50PigyMykpOyAvLyBub2RlIDEKLy8gU29ucyBvZiBub2RlIDAKKHJvb3QtPmdldEF0dHJpYnV0ZTIoMCkpLT5hcHBlbmQobmV3IGZvbzxpbnQ+KDQpKTsKKHJvb3QtPmdldEF0dHJpYnV0ZTIoMCkpLT5hcHBlbmQobmV3IGZvbzxpbnQ+KDkpKTsKLy8gU29ucyBvZiBub2RlIDEKKHJvb3QtPmdldEF0dHJpYnV0ZTIoMSkpLT5hcHBlbmQobmV3IGZvbzxpbnQ+KDE3KSk7IC8vIG5vZGUgNApyb290LT5kaXNwbGF5MygpOwp9