二叉树之二叉排序树

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

猜你喜欢

转载自blog.csdn.net/M_N_N/article/details/80872124