UVA4847排序二叉樹

2021-08-18 06:21:36 字數 1084 閱讀 4377

題意:給出n,給出一種排列, 問有多少個排列,依次插入二叉查詢樹後和它形態一樣(最普通的不旋轉,別想多)

首先明確,在乙個排列中,乙個數後面的數,比它小的一定在它左子樹,比它大的一定在右子樹。所以在這棵排序二叉樹中,如果乙個節點的左子樹中每個節點確定了插入順序,右子樹中每個節點規定了插入順序,那麼對於這個節點來說,只要它後面每個小於它的數,在小於它的中排名不變,比它大的數同理,那麼無論怎樣排列都不會影響形態。例如它的左子樹確定了每個數在排列中的順序,l1,l2,l3...同理右子樹r1,r2,r3...,那麼對於這個點的所有子節點,l1l2r1l3r2r3還是l1r1l2l3r2r3都不會改變二叉排序樹形態,所以就是左子樹方案*右子樹方案數*(左子樹加右子樹中取左子樹節點數的組合)

所以就可以先把目標排列建樹,處理出來每個節點對應的左右子樹節點數,確定這個樹的形態,做樹形dp。

然而預處理是nlogn的,如果碰到大資料卡log時會gg,看到了乙個dalaoo(n)求解orz

放上我醜陋無比的**

include#include#include#define fr(i,s,t) for (i=s;i<=t;i++)

#define mod (9999991)

#define ls (t[rt].lson)

#define rs (t[rt].rson)

#define ll long long

using namespace std;

int size,n,a[50];

ll c[50][50];

struct nodet[5000];

void update(int rt)

void insert(int &rt,int x)

if (x<=t[rt].val) insert(ls,x);

else insert(rs,x);;

update(rt);

}ll dfs(int rt)

void work()

int main()

int t_num; scanf("%d",&t_num);

while (t_num--) work();

}

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...