LeetCode: Unique Binary Search Trees [095]

151 篇文章 0 订阅

【题目】

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.

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3



【题意】

    给定一个数字n, 问用1,2,3,4,5...n这n个值,能构造多少棵合法的二叉搜索树


【思路】

    对于给定[1,n]区间,先确定所有可能的根,假设根为k, 则该二叉树左子树的取值区间为[1, k-1]和右子树的取值区间[k+1, n]。
    而二叉搜索搜索树的任意一个节点的左右子树也是二叉搜索树,因此我们需要确定[1,k-1]和[k+1, n]上构造的二叉搜索树的数目, 比如分别为left[k], right[k]。则以k的根的二叉搜索树的数目即为,left[k]*right[k]
    
    本题用递归来解决。


【代码】

class Solution {
public:
    
    int binaryTreeNums(int start, int end){
        //[start, end]区间上构造二叉树的数目
        if(start>=end)return 1;     //start<end表示空子树, start==end表示叶子节点
        
        int treeNums=0;
        
        for(int root=start; root<=end; root++){
            int leftCount = binaryTreeNums(start, root-1);  //计算左子树的数目
            int rightCount = binaryTreeNums(root+1, end);   //计算右子树的数目
            treeNums+= leftCount*rightCount;
        }
        
        return treeNums;
    }

    int numTrees(int n) {
        if(n==0)return 0;
        return binaryTreeNums(1, n);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值