首先得读懂题意,然后就非常好办了,用到一个性质:如果我们把一棵完全(注意!!)二叉树的结点按照从上到下,从左到右的顺序编号(1.......n)那么第 i个结点的左儿子的编号是 i * 2 , 右儿子的编号是 i * 2 + 1 。 #include <iostream> #include <cstring> #include <cmath> using namespace std ; const int maxn = 1024 ; char node[maxn] ;//叶子结点 int map[7] ; //初始化 void init() { memset( map , 0 , sizeof( map ) ) ; memset( node , 0 , sizeof( node ) ) ; return ; } int main() { int nf ; int icase = 1 ; while( cin >> nf ) { getchar() ; if( ! nf ) break ; cout << "S-Tree #" << icase++ << ":" << endl ; init() ; char ch ; int var ; for( int i = 0 ; i < nf ; i++ ) { cin >> ch >> var ; map[i + 1] = var ;//映射顺序 } int n = ( int )pow( 2.0 , nf ) ;//得到叶子结点的个数 for( int i = 0 ; i < n ; i++ ) { cin >> node[i] ; } int ncase ; cin >> ncase ; while( ncase-- ) { char x[7] ; memset( x , 0 , sizeof( x ) ) ; for( int i = 1 ; i <= nf ; i++ ) cin >> x[i] ;//读入各层的数据 int k = 1 ; for( int i = 1 ; i <= nf ; i++ ) { if( x[map[i]] - '0' ) k = k * 2 + 1 ;//当该层为1往右走 else k = k * 2 ;//当该层为0往左走 } cout << node[k-n] ;//输出叶子结点的数据 } cout << endl << endl ; } return 0 ; }