7 2 二叉搜尋樹的插入序列

2021-10-01 13:39:14 字數 1417 閱讀 2145

題目來自pta。

二叉搜尋樹定義為:

左子樹僅包含小於根結點的元素;

右子樹僅包含大於根結點的元素;

左右子樹均為二叉搜尋樹。

一棵二叉搜尋樹可以有不同的插入順序。例如,對於如下的二叉搜尋樹

插入序列可以是 3 2 1 4 6 5, 也可以是 3 2 4 1 6 5 但不可以是 3 2 4 5 6 1。

下面給出一棵二叉搜尋樹的先序遍歷序列,請編寫程式求出該樹的插入序列個數。考慮到總數可能非常大,請輸出總數對 1000000007 (10^9​​ +7)取餘的結果。

第一行給出乙個整數 n (0

第二行給出 n 個正整數,以空格分隔,表示二叉樹的先序遍歷序列;

在一行中輸出插入序列總數。

63 2 1 4 6 5

10分析

其實這道題的關鍵在於求出所有可能的排序,實際上是個組合問題。如果想知道詳細求出公式的過程可以自行搜尋插空法。

假設乙個樹的左子樹節點數n,左子樹符合條件的排列種數為a;其右子樹節點數為m,符合條件的排列種數為b。那麼該樹符合要求的排列總數為

a * b * c(m + n,m);

c(m + n,m)表示從m+n中取m個的組合數。

每乙個左子樹的排列數可以通過它自己的左右子樹用同樣的公式獲得。也就是說,只需要使用遞迴便可以從底下往上依次求得每個節點的排列數,最後彙總到根節點。

之後問題就變為了求組合數的問題,如果使用組合數的公式,很容易就溢位了,無法處理較大一點的數。所以此處利用楊輝三角求組合數。

楊輝三角的性質:第n行的m個數可表示為 c(n-1,m-1),即為從n-1個不同元素中取m-1個元素的組合數.

#include

#include

#define mod 1000000007

using

namespace std;

long c[

105]

[105];

void

init()

}}long

cof(

long n,

long m)

long

possibility

(vector<

int> tree)

intmain()

vector<

int> tree;

init()

;for

(int i =

0; i < size; i++

) cout <<

possibility

(tree)

% mod;

return0;

}

7 2 二叉搜尋樹的插入序列

7 2 二叉搜尋樹的插入序列 二叉搜尋樹定義為 左子樹僅包含小於根結點的元素 右子樹僅包含大於根結點的元素 左右子樹均為二叉搜尋樹。一棵二叉搜尋樹可以有不同的插入順序。例如,對於如下的二叉搜尋樹 插入序列可以是 3 2 1 4 6 5,也可以是 3 2 4 1 6 5 但不可以是 3 2 4 5 6...

二叉搜尋樹 插入 查詢

宣告 第一次寫二叉搜尋樹,可能會有bug 這棵二叉搜尋樹以中序遍歷的方式輸出,所以插入 儲存的規則也是按照中序遍歷的規則 include using namespace std struct node node root,nil 根節點和乙個空結點 void insert int key else ...

二叉搜尋樹的插入 刪除

二叉搜尋樹 就是每乙個結點的data值,都大於它的所有左孩子的data,小於所有右孩子的data 二叉搜尋樹的插入刪除的模擬 pragma once namespace ljc template class t friend class binarysorttree template class t...