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; }
时间: 2024-09-30 04:48:06