題目大意:構(gòu)造出一個(gè)長(zhǎng)度為 n 的排列,使得按照這個(gè)順序構(gòu)造出的二叉搜索樹(shù)的高度為 k
題目分析:知道 n 的大小后不難算出其可以構(gòu)造的二叉搜索樹(shù)高度的可行范圍,下限是一棵滿二叉樹(shù),這個(gè)利用倍增很快就能找到,上限就是 n ,當(dāng)且僅當(dāng)這棵樹(shù)退化為一條鏈時(shí)達(dá)到,如果在這個(gè)范圍內(nèi)是一定有解且可以構(gòu)造的
考慮如何構(gòu)造答案,首先我們先構(gòu)造一棵有 n 個(gè)節(jié)點(diǎn),高度為 k 的樹(shù),只需要先用 dfs 固定出一條長(zhǎng)度為 k 的鏈保證其高度至少為 k ,然后再用 bfs 逐層加點(diǎn)即可,當(dāng)構(gòu)造出整棵樹(shù)后,遞歸對(duì)其賦值即可,賦值策略也是根據(jù)二叉搜索樹(shù)的性質(zhì)來(lái)的,因?yàn)閷?duì)于二叉搜索樹(shù)的任意一個(gè)節(jié)點(diǎn)來(lái)說(shuō),其左子樹(shù)的所有節(jié)點(diǎn)都一定小于當(dāng)前節(jié)點(diǎn)的值,其右子樹(shù)的所有節(jié)點(diǎn)都一定大于當(dāng)前節(jié)點(diǎn)的值,所以當(dāng)前節(jié)點(diǎn)的值就是:(當(dāng)前區(qū)間的左端點(diǎn) + 左子樹(shù)的大小)