t096 樹的序號

2021-09-28 09:58:57 字數 2434 閱讀 7038

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完全相同。方法一 在規模較小且較簡單的問題中,我們可以建立乙個字串,表示中序和前序遍...