#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// class Tree2Link {
// public:
// TreeNode* ConvertTree2Link( TreeNode* n ){
// }
// void VisitTreeNode( TreeNode* n , int level, TreeNode** ph ){
// TreeNode* h = *ph;
// }
// void LinkWithHead( TreeNode** ph, TreeNode* c ){
// if( !c ) return;
// TreeNode* h = *ph;
// h->left = c;
// c->right = h;
// *ph = c;
// }
// };
class Solution {
vector<TreeNode*> headlist;
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> > result;
if( root ) {
DFSVisit(root,0);
size_t n=headlist.size();
result.resize(n);
for( size_t i=0; i<n; i++ ){
TreeNode* h = headlist[i];
while( (h ) ){
result[i].push_back( h->val );
h = h->left;
}
reverse( result[i].begin(), result[i].end() );
}
}
return result;
}
void DFSVisit( TreeNode* n, size_t level ){
//cerr << "DFSVISIT" << endl;
TreeNode* l = n->left;
TreeNode* r = n->right;
AppendNodeToHeadlist( n, level );
if( l ) DFSVisit( l, level+1);
if( r ) DFSVisit( r, level+1);
}
void AppendNodeToHeadlist( TreeNode* n, size_t l ){
//cerr << "DFSVISIT" << endl;
//printf( "healist size %lu \n", headlist.size() );
//printf( "node to append %d \n", n->val );
if( headlist.size() < l+1 ){
headlist.push_back(NULL);
headlist[l] = n;
n->left = NULL;
}
else{
//printf( "setting head of %lu from %d to %d\n", l, headlist[l]->val, n->val );
TreeNode* h = headlist[l];
h->right = n;
n->left = h;
headlist[l]=n;
//printf( "chain[%lu]: %d->%d\n",l, h->val, n->val );
}
}
};
void print_result( vector<vector<int> >& r ){
//cerr << "DFSVISIT" << endl;
for( size_t i=0; i<r.size(); i++ ){
for( size_t j=0; j<r[i].size(); j++ ){
printf( "%d ", r[i][j] );
}
printf( "\n" );
}
printf( "\n" );
}
void test_solution0(){
Solution s;
auto r = s.levelOrder(NULL);
vector<vector<int> > e;
if ( r == e ){
printf( "CASE0 PASSED!\n" );
}
else{
printf( "CASE0 FAILED!\n" );
printf( "===Actual Result ===\n");
print_result( r );
printf( "===Expected Result ===\n");
print_result( e );
}
}
void test_solution1(){
TreeNode n1(1),n2(2),n3(3),n4(4),n5(5);
n1.left = &n2;
n1.right = &n3;
n3.left = &n4;
n3.right = &n5;
Solution s;
auto r = s.levelOrder(&n1);
vector<vector<int> > e = { {1}, {2,3}, {4,5} };
if ( r == e ){
printf( "CASE1 PASSED!\n" );
}
else{
printf( "CASE1 FAILED!\n" );
printf( "===Actual Result ===\n");
print_result( r );
printf( "===Expected Result ===\n");
print_result( e );
}
}
void test_solution2(){
TreeNode n1(1),n2(2),n3(3),n4(4),n5(5), n6(6);
n1.left = &n2;
n1.right = &n3;
n3.left = &n4;
n3.right = &n5;
n2.left = &n6;
Solution s;
auto r = s.levelOrder(&n1);
vector<vector<int> > e = { {1}, {2,3}, {6,4,5} };
if ( r == e ){
printf( "CASE2 PASSED!\n" );
}
else{
printf( "CASE2 FAILED!\n" );
printf( "===Actual Result ===\n");
print_result( r );
printf( "===Expected Result ===\n");
print_result( e );
}
}
int main(){
test_solution0();
test_solution1();
test_solution2();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnN0cnVjdCBUcmVlTm9kZSB7CiAgICBpbnQgdmFsOwogICAgVHJlZU5vZGUgKmxlZnQ7CiAgICBUcmVlTm9kZSAqcmlnaHQ7CiAgICBUcmVlTm9kZShpbnQgeCkgOiB2YWwoeCksIGxlZnQoTlVMTCksIHJpZ2h0KE5VTEwpIHt9Cn07CgovLyBjbGFzcyBUcmVlMkxpbmsgewovLyBwdWJsaWM6CiAgICAvLyBUcmVlTm9kZSogQ29udmVydFRyZWUyTGluayggVHJlZU5vZGUqIG4gKXsKICAgIC8vIH0KCiAgICAvLyB2b2lkIFZpc2l0VHJlZU5vZGUoIFRyZWVOb2RlKiBuICwgaW50IGxldmVsLCBUcmVlTm9kZSoqIHBoICl7CiAgICAvLyAgICBUcmVlTm9kZSogaCA9ICpwaDsKCgogICAgLy8gfQoKICAgIC8vIHZvaWQgTGlua1dpdGhIZWFkKCAgVHJlZU5vZGUqKiBwaCwgVHJlZU5vZGUqIGMgKXsKICAgICAgICAvLyBpZiggIWMgKSByZXR1cm47CiAgICAgICAgLy8gVHJlZU5vZGUqIGggPSAqcGg7CiAgICAgICAgLy8gaC0+bGVmdCA9IGM7CiAgICAgICAgLy8gYy0+cmlnaHQgPSBoOwogICAgICAgIC8vICpwaCA9IGM7CiAgICAvLyB9Ci8vIH07CgpjbGFzcyBTb2x1dGlvbiB7CiAgICB2ZWN0b3I8VHJlZU5vZGUqPiBoZWFkbGlzdDsKcHVibGljOgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gbGV2ZWxPcmRlcihUcmVlTm9kZSAqcm9vdCkgewogICAgCXZlY3Rvcjx2ZWN0b3I8aW50PiA+IHJlc3VsdDsKICAgICAgICBpZiggcm9vdCApIHsKICAgICAgICAJREZTVmlzaXQocm9vdCwwKTsKCSAgICAgICAgc2l6ZV90IG49aGVhZGxpc3Quc2l6ZSgpOwoJICAgICAgICByZXN1bHQucmVzaXplKG4pOwoJICAgICAgICBmb3IoIHNpemVfdCBpPTA7IGk8bjsgaSsrICl7CgkgICAgICAgICAgICBUcmVlTm9kZSogaCA9IGhlYWRsaXN0W2ldOwoJICAgICAgICAgICAgd2hpbGUoIChoICkgKXsKCSAgICAgICAgICAgICAgICByZXN1bHRbaV0ucHVzaF9iYWNrKCBoLT52YWwgKTsKCSAgICAgICAgICAgICAgICBoID0gaC0+bGVmdDsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHJldmVyc2UoIHJlc3VsdFtpXS5iZWdpbigpLCByZXN1bHRbaV0uZW5kKCkgKTsKCSAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwoKICAgIH0KCiAgICB2b2lkIERGU1Zpc2l0KCBUcmVlTm9kZSogbiwgc2l6ZV90IGxldmVsICl7CiAgICAJLy9jZXJyIDw8ICJERlNWSVNJVCIgPDwgZW5kbDsKICAgICAgICBUcmVlTm9kZSogbCA9IG4tPmxlZnQ7CiAgICAgICAgVHJlZU5vZGUqIHIgPSBuLT5yaWdodDsKICAgICAgICBBcHBlbmROb2RlVG9IZWFkbGlzdCggbiwgbGV2ZWwgKTsKICAgICAgICBpZiggbCAgKSBERlNWaXNpdCggbCwgbGV2ZWwrMSk7CiAgICAgICAgaWYoIHIgICkgREZTVmlzaXQoIHIsIGxldmVsKzEpOwogICAgfQoKICAgIHZvaWQgQXBwZW5kTm9kZVRvSGVhZGxpc3QoIFRyZWVOb2RlKiBuLCBzaXplX3QgbCApewogICAgCS8vY2VyciA8PCAiREZTVklTSVQiIDw8IGVuZGw7CiAgICAgICAgLy9wcmludGYoICJoZWFsaXN0IHNpemUgJWx1IFxuIiwgaGVhZGxpc3Quc2l6ZSgpICk7CiAgICAgICAgLy9wcmludGYoICJub2RlIHRvIGFwcGVuZCAlZCBcbiIsIG4tPnZhbCApOwogICAgICAgIGlmKCBoZWFkbGlzdC5zaXplKCkgPCBsKzEgKXsKICAgICAgICAgICAgaGVhZGxpc3QucHVzaF9iYWNrKE5VTEwpOwogICAgICAgICAgICBoZWFkbGlzdFtsXSA9IG47CiAgICAgICAgICAgIG4tPmxlZnQgPSBOVUxMOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICAvL3ByaW50ZiggInNldHRpbmcgaGVhZCBvZiAlbHUgZnJvbSAlZCB0byAlZFxuIiwgbCwgaGVhZGxpc3RbbF0tPnZhbCwgbi0+dmFsICk7CiAgICAgICAgICAgIFRyZWVOb2RlKiBoID0gaGVhZGxpc3RbbF07CiAgICAgICAgICAgIGgtPnJpZ2h0ID0gbjsKICAgICAgICAgICAgbi0+bGVmdCAgPSBoOwogICAgICAgICAgICBoZWFkbGlzdFtsXT1uOwogICAgICAgICAgICAvL3ByaW50ZiggImNoYWluWyVsdV06ICVkLT4lZFxuIixsLCBoLT52YWwsIG4tPnZhbCApOwoKICAgICAgICB9CiAgICB9Cn07Cgp2b2lkIHByaW50X3Jlc3VsdCggdmVjdG9yPHZlY3RvcjxpbnQ+ID4mIHIgKXsKICAgIC8vY2VyciA8PCAiREZTVklTSVQiIDw8IGVuZGw7CiAgICBmb3IoIHNpemVfdCBpPTA7IGk8ci5zaXplKCk7IGkrKyApewogICAgICAgIGZvciggc2l6ZV90IGo9MDsgajxyW2ldLnNpemUoKTsgaisrICl7CiAgICAgICAgICAgIHByaW50ZiggIiVkICIsIHJbaV1bal0gKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCAiXG4iICk7CiAgICB9CiAgICBwcmludGYoICJcbiIgKTsKfQoKdm9pZCB0ZXN0X3NvbHV0aW9uMCgpewoKICAgIFNvbHV0aW9uIHM7CiAgICBhdXRvIHIgPSBzLmxldmVsT3JkZXIoTlVMTCk7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4gPiBlOwogICAgaWYgKCByID09IGUgKXsKICAgICAgICBwcmludGYoICJDQVNFMCBQQVNTRUQhXG4iICk7CiAgICB9CiAgICBlbHNlewogICAgICAgIHByaW50ZiggIkNBU0UwIEZBSUxFRCFcbiIgKTsKICAgICAgICBwcmludGYoICI9PT1BY3R1YWwgICBSZXN1bHQgPT09XG4iKTsKICAgICAgICBwcmludF9yZXN1bHQoIHIgKTsKICAgICAgICBwcmludGYoICI9PT1FeHBlY3RlZCBSZXN1bHQgPT09XG4iKTsKICAgICAgICBwcmludF9yZXN1bHQoIGUgKTsKICAgIH0KCn0KCnZvaWQgdGVzdF9zb2x1dGlvbjEoKXsKICAgIFRyZWVOb2RlIG4xKDEpLG4yKDIpLG4zKDMpLG40KDQpLG41KDUpOwogICAgbjEubGVmdCAgPSAmbjI7CiAgICBuMS5yaWdodCA9ICZuMzsKICAgIG4zLmxlZnQgID0gJm40OwogICAgbjMucmlnaHQgPSAmbjU7CgogICAgU29sdXRpb24gczsKICAgIGF1dG8gciA9IHMubGV2ZWxPcmRlcigmbjEpOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gZSA9IHsgezF9LCB7MiwzfSwgezQsNX0gfTsKICAgIGlmICggciA9PSBlICl7CiAgICAgICAgcHJpbnRmKCAiQ0FTRTEgUEFTU0VEIVxuIiApOwogICAgfQogICAgZWxzZXsKICAgICAgICBwcmludGYoICJDQVNFMSBGQUlMRUQhXG4iICk7CiAgICAgICAgcHJpbnRmKCAiPT09QWN0dWFsICAgUmVzdWx0ID09PVxuIik7CiAgICAgICAgcHJpbnRfcmVzdWx0KCByICk7CiAgICAgICAgcHJpbnRmKCAiPT09RXhwZWN0ZWQgUmVzdWx0ID09PVxuIik7CiAgICAgICAgcHJpbnRfcmVzdWx0KCBlICk7CiAgICB9Cgp9Cgp2b2lkIHRlc3Rfc29sdXRpb24yKCl7CiAgICBUcmVlTm9kZSBuMSgxKSxuMigyKSxuMygzKSxuNCg0KSxuNSg1KSwgbjYoNik7CiAgICBuMS5sZWZ0ICA9ICZuMjsKICAgIG4xLnJpZ2h0ID0gJm4zOwogICAgbjMubGVmdCAgPSAmbjQ7CiAgICBuMy5yaWdodCA9ICZuNTsKICAgIG4yLmxlZnQgID0gJm42OwoKICAgIFNvbHV0aW9uIHM7CiAgICBhdXRvIHIgPSBzLmxldmVsT3JkZXIoJm4xKTsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IGUgPSB7IHsxfSwgezIsM30sIHs2LDQsNX0gfTsKICAgIGlmICggciA9PSBlICl7CiAgICAgICAgcHJpbnRmKCAiQ0FTRTIgUEFTU0VEIVxuIiApOwogICAgfQogICAgZWxzZXsKICAgICAgICBwcmludGYoICJDQVNFMiBGQUlMRUQhXG4iICk7CiAgICAgICAgcHJpbnRmKCAiPT09QWN0dWFsICAgUmVzdWx0ID09PVxuIik7CiAgICAgICAgcHJpbnRfcmVzdWx0KCByICk7CiAgICAgICAgcHJpbnRmKCAiPT09RXhwZWN0ZWQgUmVzdWx0ID09PVxuIik7CiAgICAgICAgcHJpbnRfcmVzdWx0KCBlICk7CiAgICB9Cgp9CgppbnQgbWFpbigpewoJdGVzdF9zb2x1dGlvbjAoKTsKCXRlc3Rfc29sdXRpb24xKCk7Cgl0ZXN0X3NvbHV0aW9uMigpOwogICAgcmV0dXJuIDA7Cn0K