程序员代码面试指南 3.23:统计和生成所有不同的二叉树

统计和生成所有不同的二叉树

https://www.nowcoder.com/practice/3975b2a794ee419aa927b24f6495c7d6

1、思路

  • 在动态规划中,我们用nums[i]来代表i个节点的搜索二叉树有多少种可能;

  • 假设一棵二叉搜索树有i个节点,若以j (1 <= j <= i)作为头节点,那么i的左子树有i - 1个节点,右子树有i - j个节点。故以i为头节点的可能结构有nums[i - 1] * nums[i - j]种。

2、代码

#include <iostream>
#include <vector>

using namespace std;

int numTrees(int n)
{
    if (n < 2)
    {
        return 1;
    }

    vector<long long> nums(n + 1, 0);
    nums[0] = 1;                        //初始化 0 个节点有 1 中可能结构

    for (int i = 1; i <= n; ++ i)       //二叉搜索树有 i 个节点
    {
        for (int j = 1; j <= i; ++ j)   //以 j 为头节点
        {
            nums[i] = ((nums[j - 1] * nums[i - j] % 1000000007) + nums[i]) % 1000000007;
        }
    }

    return nums[n];
}

int main()
{
    int n;
    cin >> n;

    cout << numTrees(n) << endl;

    return 0;
}

主要是为左程云的《程序员代码面试指南》这本书改写C++版的题解。

全部评论

相关推荐

03-28 22:31
门头沟学院 Java
点赞 评论 收藏
分享
03-03 10:35
3d人士会梦见住进比弗利山庄吗:这四个项目属于是初学者的玩具了。不知道面试官咋问,而且双非本搞算法除了9,还是保守至少c9
点赞 评论 收藏
分享
牛客316659795号:不是,证明hr初筛已经过了,要投给部门筛一遍
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务