二叉排序樹(Binary Sort Tree),又稱二叉查找樹(Binary Search Tree),亦稱二叉搜索樹。
定義
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
(3)左、右子樹也分別爲二叉排序樹;
查找
步驟:
若根結點的關鍵字值等於查找的關鍵字,成功。
否則,若小於根結點的關鍵字值,遞歸查左子樹。
若大於根結點的關鍵字值,遞歸查右子樹。
若子樹爲空,查找不成功。
描述
給出 n,問由 1...n 爲節點組成的不同的二叉查找樹有多少種?
樣例
給出n = 3,有5種不同形態的二叉查找樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int numTrees(int n) {
// write your code here
int i, j;
int dp[n + 1] = {0};
dp[0] = 1;
for (i = 1; i <= n; ++i) {
for (j = 0; j < (i - 1) / 2; ++j) {
dp[i] += dp[j] * dp[i - j - 1] * 2;
}
dp[i] += dp[j] * dp[i - j - 1] * (i % 2 == 0 ? 2 : 1);
}
return dp[n];
}
};
dp[n] =∑(dp[i] * dp[n - i - 1])
i = 0; i->n - 1;