LeetCode 96: Unique Binary Search Trees

来源:互联网 发布:网络环境被劫持 编辑:程序博客网 时间:2024/06/05 04:45

Unique Binary Search Trees

Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?

For example,
Given n = 3, there are a total of 5 unique BST’s.
图片

解题思路

本题求的是有 n 个结点的二叉树共有多少种不同的结构。

思路一:当有 01 个节点时,二叉树只有一种形状。当 n1 时,枚举左子树节点数依次为 0,1,,n1 时的情况进行递归求解,并将每一种情况下的结果累加即可。基本代码如下:

class Solution {public:    int numTrees(int n) {        // 节点数小于等于1时只能形成一种形状的二叉树        if (n <= 1) return 1;        int sum = 0;        for (int i = 1; i <= n; i++) {            // 枚举二叉树的左右节点数,递归;结果相乘            sum += (numTrees(i-1) * numTrees(n-i));        }        return sum;    }};

思路二:不难发现上述思路存在许多重复计算的情况,可以使用动态规划进行优化。维护一个数组 dp[],其中 dp[i] 表示有 i 个结点时能产生的二叉搜索树的个数,则 dp[] 存在如下的递推关系:

dp[i]={1,i1j=0dp[j]dp[ij1],if n=0 or n=1if n2

代码如下:

class Solution {public:    int numTrees(int n) {        int dp[n+1];        dp[0] = dp[1] = 1; // 节点数小于等于1时只能形成一种形状的二叉树        // 依次求出结点数为2, ..., n时可以形成的二叉树个数        for (int i = 2; i <= n; i++) {            dp[i] = 0;            // 枚举二叉树的左右节点数,递归;结果相乘            for (int j = 0; j < i; ++j) {                dp[i] += (dp[j] * dp[i-j-1]);            }        }        return dp[n];    }};
0 0
原创粉丝点击