#include <iostream>
#include <memory>
#include <vector>
class Node {
public:
using NodePtr = std::unique_ptr<Node>;
Node( char lc, NodePtr l, NodePtr r ) :
c( lc ), left( std::move(l) ), right( std::move(r) )
{
}
~Node();
private:
NodePtr left;
NodePtr right;
char c;
};
Node::~Node()
{
std::cout << "destroying " << c << std::endl;
if( ! (left || right) ) // optimization
return;
std::vector<NodePtr> nodes;
auto populate = [&nodes] ( Node *n ) {
if( n->left ) nodes.push_back( std::move( n->left ) );
if( n->right ) nodes.push_back( std::move( n->right ) );
};
populate( this );
while( !nodes.empty() ) {
auto n = std::move( nodes.back() );
nodes.pop_back();
populate( n.get() );
}
}
int main() {
Node root( 'A',
std::make_unique<Node>( 'l', std::make_unique<Node>( 'L', nullptr, nullptr ), nullptr ),
std::make_unique<Node>( 'r', std::make_unique<Node>( 'R', nullptr, nullptr ), nullptr ) );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgTm9kZSB7CnB1YmxpYzoKICAgdXNpbmcgTm9kZVB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxOb2RlPjsKICAgTm9kZSggY2hhciBsYywgTm9kZVB0ciBsLCBOb2RlUHRyIHIgKSA6CgljKCBsYyApLCBsZWZ0KCBzdGQ6Om1vdmUobCkgKSwgcmlnaHQoIHN0ZDo6bW92ZShyKSApCiAgIHsKICAgfQogICB+Tm9kZSgpOwoKcHJpdmF0ZToKICAgTm9kZVB0ciBsZWZ0OwogICBOb2RlUHRyIHJpZ2h0OwogICBjaGFyICAgIGM7Cn07CgoKTm9kZTo6fk5vZGUoKQp7CglzdGQ6OmNvdXQgPDwgImRlc3Ryb3lpbmcgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsKCQogICAgIGlmKCAhIChsZWZ0IHx8IHJpZ2h0KSApIC8vIG9wdGltaXphdGlvbgogICAgICAgICByZXR1cm47CiAgICAgc3RkOjp2ZWN0b3I8Tm9kZVB0cj4gbm9kZXM7CiAgICAgYXV0byBwb3B1bGF0ZSA9IFsmbm9kZXNdICggTm9kZSAqbiApIHsKICAgICAgICAgaWYoIG4tPmxlZnQgKSBub2Rlcy5wdXNoX2JhY2soIHN0ZDo6bW92ZSggbi0+bGVmdCApICk7CiAgICAgICAgIGlmKCBuLT5yaWdodCApIG5vZGVzLnB1c2hfYmFjayggc3RkOjptb3ZlKCBuLT5yaWdodCApICk7CiAgICAgfTsKICAgICBwb3B1bGF0ZSggdGhpcyApOwogICAgIHdoaWxlKCAhbm9kZXMuZW1wdHkoKSApIHsKICAgICAgICAgYXV0byBuID0gc3RkOjptb3ZlKCBub2Rlcy5iYWNrKCkgKTsKICAgICAgICAgbm9kZXMucG9wX2JhY2soKTsKICAgICAgICAgcG9wdWxhdGUoIG4uZ2V0KCkgKTsKICAgICB9Cn0KCgppbnQgbWFpbigpIHsKCU5vZGUgcm9vdCggJ0EnLCAKCSAgICBzdGQ6Om1ha2VfdW5pcXVlPE5vZGU+KCAnbCcsIHN0ZDo6bWFrZV91bmlxdWU8Tm9kZT4oICdMJywgbnVsbHB0ciwgbnVsbHB0ciApLCBudWxscHRyICksCgkgICAgc3RkOjptYWtlX3VuaXF1ZTxOb2RlPiggJ3InLCBzdGQ6Om1ha2VfdW5pcXVlPE5vZGU+KCAnUicsIG51bGxwdHIsIG51bGxwdHIgKSwgbnVsbHB0ciApICk7CglyZXR1cm4gMDsKfQ==