99 lines
2.4 KiB
C++
99 lines
2.4 KiB
C++
/*
|
|
VIM: let b:lcppflags="-std=c++11 -O2 -pthread"
|
|
VIM: let b:wcppflags="/O2 /EHsc /DWIN32"
|
|
VIM: let b:argv=""
|
|
*/
|
|
#include <vector>
|
|
#include <string>
|
|
#include <stack>
|
|
#include <iostream>
|
|
|
|
struct node {
|
|
node * left = nullptr;
|
|
node * right = nullptr;
|
|
double data = 0;
|
|
|
|
node( double d )
|
|
: data(d)
|
|
{}
|
|
};
|
|
|
|
node * prefix_to_tree( const std::vector<double>& v ){
|
|
|
|
if ( !v.size() ){
|
|
return nullptr;
|
|
}
|
|
|
|
node * root = new node(v[0]);
|
|
|
|
std::stack<node*> stack;
|
|
stack.push(root);
|
|
|
|
for ( int i = 1; i < v.size(); ) {
|
|
if ( v[i] < stack.top()->data ){
|
|
auto n = new node(v[i++]);
|
|
stack.top()->left = n;
|
|
stack.push(n);
|
|
} else {
|
|
auto c = stack.top();
|
|
stack.pop();
|
|
while( !stack.empty() && stack.top()->data < v[i] ){
|
|
c = stack.top();
|
|
stack.pop();
|
|
}
|
|
|
|
auto n = new node(v[i++]);
|
|
c->right = n;
|
|
stack.push(n);
|
|
}
|
|
}
|
|
|
|
return root;
|
|
}
|
|
|
|
void print( node * root, const std::string& level = "" ){
|
|
if ( root ) {
|
|
print( root->left, level + " ");
|
|
std::cout << level << "- " << root->data << std::endl;
|
|
print( root->right, level + " ");
|
|
}
|
|
}
|
|
|
|
void traverse( node * root, std::vector<double>& v ){
|
|
if ( root ) {
|
|
v.push_back(root->data);
|
|
traverse(root->left, v);
|
|
traverse(root->right, v);
|
|
}
|
|
}
|
|
|
|
void test( const std::vector<double>& v ){
|
|
std::cout << "-----------------------------------------------------" << std::endl;
|
|
auto r = prefix_to_tree( v );
|
|
print( r );
|
|
std::vector<double> w;
|
|
traverse( r, w );
|
|
if ( v.size() != w.size() ) {
|
|
std::cout << "v.size() != w.size() => " << v.size() << " != " << w.size() << std::endl;
|
|
}
|
|
for (int i = 0; i < v.size(); ++i ){
|
|
if (v[i]!=w[i]){
|
|
std::cout << "error at index " << i << " -> "<< v[i] << " != " << w[i] << std::endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
int main( void ) {
|
|
|
|
test( {1} );
|
|
test( {2, 1, 3} );
|
|
test( {4, 2, 1, 3, 6, 5, 7} );
|
|
test( {8, 4, 2, 1, 3, 6, 5, 7, 12, 10, 9, 11, 14, 13, 15} );
|
|
test( {8, 4, 2, 3, 6, 5, 7, 12, 10, 9, 11, 14, 13, 15} );
|
|
test( {8, 4, 6, 5, 7, 12, 10, 9, 14, 13, 15} );
|
|
test( {8, 12, 10, 9, 11, 14, 13, } );
|
|
test( {8, 4, 2, 1, 6, 12, 10, 11, 14, 15} );
|
|
|
|
return 0;
|
|
}
|