再过几天就数据结构的考试了,看到BST那一章忍不住想做几个BST的题目,于是上次浙大月赛的题目做了一下,蛮不错的,即考察了模拟能力,又需要一些想法的目,构图是简单的,构图完成后,就有这样一个子问题需要解决:给定一颗二叉搜索树的模型(数还没有填上去),如何用已有的数来构造这棵树,可以这样想,假如根节点的值的大小为第m大,那么它的右子树的根节点的大小是什么呢?答案很显然,就是第m+1+w大(其中w表示右子树为根的左子孙的个数),同样,也可以知道左子树为根的情况,递归求解。
#include <iostream>
using namespace std;
int n;
struct point {
int a;
int index;
}p[ 200 ];
int cmp( const void *a, const void *b ) {
point *c = (point *)a;
point *d = (point *)b;
return c->a - d->a;
}
struct Tree {
int Data;
int Num;
int Left;
int Right;
}T[ 200 ];
int pre[ 200 ][ 200 ];
int flag;
void dfs( int key, int Index ) {
int L = T[ key ].Left;
int R = T[ key ].Right;
if( T[ key ].Data > 1 ) {
if( T[ L ].Data == 0 ) {
}else if( T[ L ].Data == 1 ) {
T[ L ].Num = p[ Index-1 ].a;
}else {
T[ L ].Num = p[ Index - 1 - T[ T[ L ].Right ].Data ].a;
dfs( L, Index - 1 - T[ T[ L ].Right ].Data );
}
if( T[ R ].Data == 0 ) {
}else if( T[ R ].Data == 1 ) {
T[ R ].Num = p[ Index+1 ].a;
}else {
T[ R ].Num = p[ Index + 1 + T[ T[ R ].Left ].Data ].a;
dfs( R, Index + 1 + T[ T[ R ].Left ].Data );
}
}
}
void DFS( int key ) {
int L = T[ key ].Left;
int R = T[ key ].Right;
if( T[ key ].Data > 1 ) {
if( T[ L ].Data )
DFS( L );
if( T[ R ].Data )
DFS( R );
}
if( flag ++ ) {
printf(" ");
}
printf( "%d", T[ key ].Num );
}
int main() {
int i, j;
int L, las, now;
int t;
while( scanf("%d", &n) != EOF ){
flag = 0;
for(i = 0; i < n; i++) {
scanf("%d", &p[i].a);
p[i].index = i;
}
qsort( p, n, sizeof( point ), cmp );
scanf("%d", &L);
t = 1;
T[ 0 ].Data = 0;
las = 0;
pre[ 0 ][ las ++ ] = t++;
T[ 1 ].Data = n;
now = 0;
for(i = 1; i < L; i++) {
for(j = 0; j < las; j++) {
int p;
scanf("%d", &p);
T[ pre[i-1][ j ] ].Left = t++;
T[ t-1 ].Data = p;
if( p > 1 ) {
pre[i][ now++ ] = t-1;
}
scanf("%d", &p);
T[ pre[i-1][ j ] ].Right = t++;
T[ t-1 ].Data = p;
if( p > 1 ) {
pre[i][ now++ ] = t-1;
}
}
las = now;
now = 0;
}
if( n == 1 ) {
printf("%d\n", p[0].a);
continue;
}
T[ 1 ].Num = p[ T[ T[1].Left ].Data ].a;
dfs( 1, T[ T[1].Left ].Data );
DFS( 1 );
puts("");
}
}