time limit: 1 second
memory limit: 128 mb
【問題描述】
我們可以用下面的方案給二叉樹標號:
空樹的序號為0。
只有乙個根結點的樹序號為1。
所有包含m個結點的二叉樹的序號一定比任何乙個包含m+1個結點的二叉樹的序號 小。
任何一棵二叉樹有m個結點,若它的序號為n,其左子樹序號為l,右子樹序號為r,
則所有序號大於n且有m個結點的二叉樹必滿足下列條件之一:
——左子樹序號大於l;
——左子樹序號等於l且右子樹序號大於r;
前5棵二叉樹的形狀如下:
你的任務就是對給定的序號,輸出該序號所對應的二叉樹。
【輸入格式】
輸入檔案包含多組資料,每個資料只有乙個單獨的整數n(1<=n<=500,000,000)。當n=0
時表示輸入檔案結束,但你不必輸出n=0時的空樹。
【輸出格式】
對每個資料產生乙個輸出,每個資料僅輸出一行,表示對應序號的樹。 輸出樹時使用下列格式:
一棵樹若沒有子樹則輸出根:x。
一棵樹有左子樹l和右子樹r應當輸出(l』)x(r』),l』和r』為序號l和r對應的二叉樹。當然,若l=0,則輸出x(r』);若r=0,
則輸出(l』)x。
sample input
1 20
31117532
sample output
x ((x)x(x))x (x(x(((x(x))x(x))x(x))))x(((x((x)x((x)x)))x)x)
【題目鏈結】:
【題意】
【題解】
用卡特蘭數(其實就是個遞推)來計數;
具體實現及講解看**的注釋(寫得很詳細了)
【完整**】
#include
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair pii;
typedef pairpll;
const
int dx[9] = ;
const
int dy[9] = ;
const
double pi = acos(-1.0);
const
int n = 110;
int n,top,l[n],r[n];
ll f[n];
void init()
void dfs(int x,int numjd,int rest)
d = rest-(d-f[k]*f[numjd-k-1]);//確定左子樹應該有k個節點
//然後右子樹有numjd-k-1個節點
int numl = (d-1)/(f[numjd-k-1]) + 1;//右子樹有numjd-k-1個節點的時候,對應的
//左子樹k個節點,左子樹需要多少個不同的k節點的子樹,也即左子樹的編號還要遞增多少
int numr = d-(numl-1)*f[numjd-k-1];
//左子樹遞增了那麼多編號之後,右子樹滿的有numl-1個,然後還要再遞增編號numr個
//這裡是優先遞增右子樹的
//因為左子樹的權比較大
if (k>0)
if (numjd-k-1>0)
}void get_ans()
tot = n-(tot-f[k]);//tot最後就是這個節點個數的對應的樹是第幾個樹
top = 1;
dfs(1,k,tot);//節點的個數為k個,然後需要再遞增編號tot次
}void pri(int x)
putchar('x');
if (r[x])
}int main()
//printf("\n%.2lf sec \n", (double)clock() / clocks_per_sec);
return
0;}
t096 樹的序號
time limit 1 second memory limit 128 mb 問題描述 我們可以用下面的方案給二叉樹標號 空樹的序號為0。只有乙個根結點的樹序號為1。所有包含m個結點的二叉樹的序號一定比任何乙個包含m 1個結點的二叉樹的序號 小。任何一棵二叉樹有m個結點,若它的序號為n,其左子樹序...
力扣演算法題 096不同的二叉樹 二叉樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 解題思路 就跟斐波那契數列一樣,我們把n 0 時賦為1,因為空樹也算一種二叉搜尋樹,那麼n 1...
判斷樹T2是否為T1的子樹
你有兩顆非常大的二叉樹 t1,有幾百萬個節點 t2有幾百個節點。設計乙個演算法,判斷t2是否為t1的子樹。如果t1有乙個節點n,其子樹與t2一模一樣,則t2為t1的子樹。也就是說,從節點n 處把樹砍斷,得到的樹與t2完全相同。方法一 在規模較小且較簡單的問題中,我們可以建立乙個字串,表示中序和前序遍...