#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)
{
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+KiBlbGVtZW50KSB7YXR0cmlidXRlMi5wdXNoX2JhY2soZWxlbWVudCk7fQoKICB2b2lkIGZvbzJ2ZWN0b3Ioc3RkOjp2ZWN0b3I8VD4mIHYpCiAgewogICAgdi5wdXNoX2JhY2soYXR0cmlidXRlMSk7CiAgICBpZiAoYXR0cmlidXRlMi5zaXplKCk+MCkgCiAgICB7CiAgICAgICAgZm9yKGludCBpPTA7IGk8YXR0cmlidXRlMi5zaXplKCk7aSsrKSAKICAgICAgICAgICAgYXR0cmlidXRlMltpXS0+Zm9vMnZlY3Rvcih2KTsKICAgIH0KICB9Cgp2b2lkIGRpc3BsYXkzKCljb25zdAp7CiAgICBzdGQ6OnZlY3RvcjxUPiB2OwogICAgZm9vMnZlY3Rvcih2KTsKICAgIHN0ZDo6cmV2ZXJzZSh2LmJlZ2luKCksdi5lbmQoKSk7CiAgICBmb3IgKGludCBpPTA7aTx2LnNpemUoKTtpKyspCiAgICAgICAgc3RkOjpjb3V0PDx2W2ldPDwiXHQiOwp9Cgp9OwoKaW50IG1haW4oKQp7CmZvbzxpbnQ+KiByb290PW5ldyBmb288aW50PigxMik7CnJvb3QtPmFwcGVuZChuZXcgZm9vPGludD4oOCkpOyAvLyBub2RlIDAKcm9vdC0+YXBwZW5kKG5ldyBmb288aW50PigyMykpOyAvLyBub2RlIDEKLy8gU29ucyBvZiBub2RlIDAKKHJvb3QtPmdldEF0dHJpYnV0ZTIoMCkpLT5hcHBlbmQobmV3IGZvbzxpbnQ+KDQpKTsKKHJvb3QtPmdldEF0dHJpYnV0ZTIoMCkpLT5hcHBlbmQobmV3IGZvbzxpbnQ+KDkpKTsKLy8gU29ucyBvZiBub2RlIDEKKHJvb3QtPmdldEF0dHJpYnV0ZTIoMSkpLT5hcHBlbmQobmV3IGZvbzxpbnQ+KDE3KSk7IC8vIG5vZGUgNApyb290LT5kaXNwbGF5MygpOwp9