二叉排序树(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;