UVA 10821 - Constructing BST
题意:有1 - n的数字,要构造一棵高度不超过h的BST,并且要字典序最小的,输出序列
思路:贪心构造,既然字典序最小,那么每个子树的根都要尽量小,那么也就是右子树尽量填满,按照这个策略去dfs构造即可
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, h;
void dfs(int s, int n, int h) {
if (h == 0 || n == 0) return;
int tmp = max(0, n - (1<<(h - 1)));
printf(" %d", s + tmp + 1);
dfs(s, tmp, h - 1);
dfs(s + tmp + 1, n - tmp - 1, h - 1);
}
int main() {
int cas = 0;
while (~scanf("%d%d", &n, &h) && n || h) {
printf("Case %d:", ++cas);
if ((1<<h) - 1 < n) {
printf(" Impossible.\n");
continue;
}
dfs(0, n, h);
printf("\n");
}
return 0;
}