zoukankan      html  css  js  c++  java
  • 096 Unique Binary Search Trees 不同的二叉查找树

    给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?
    例如,
    给出 n = 3,则有 5 种不同形态的二叉查找树:
       1         3     3      2      1
               /     /      /      
         3     2     1      1   3      2
        /     /                       
       2     1         2                 3
    详见:https://leetcode.com/problems/unique-binary-search-trees/description/

    这道题实际上是 Catalan Number卡塔兰数的一个例子。当n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为根,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

    dp[2] =  dp[0] * dp[1]   (1为根的情况)

        + dp[1] * dp[0]    (2为根的情况)

    同理可写出 n = 3 的计算方法:

    dp[3] =  dp[0] * dp[2]   (1为根的情况)

        + dp[1] * dp[1]    (2为根的情况)

          + dp[2] * dp[0]    (3为根的情况)

    由此可以得出卡塔兰数列的递推式为:

    C_0 = 1 quad mbox{and} quad C_{n+1}=sum_{i=0}^{n}C_i\,C_{n-i}quadmbox{for }nge 0.

    Java实现:

    class Solution {
        public int numTrees(int n) {
            int[] dp=new int[n+1];
            dp[0]=1;
            dp[1]=1;
            for(int i=2;i<=n;++i){
                for(int j=0;j<i;++j){
                    dp[i]+=dp[j]*dp[i-j-1];
                }
            }
            return dp[n];
        }
    }
    

    参考:https://www.cnblogs.com/grandyang/p/4299608.html

  • 相关阅读:
    剑指47 礼物的最大价值
    剑指46 把数字转化成字符串
    剑指41:数据流中的中位数
    剑指39 数组中出现次数超过半数的数
    centos 7关闭与启用防火墙,开放端口,常用命令介绍
    用docker swarm搭建docker集群
    centos 7离线安装docker, 离线安装docker-compose
    centos 7离线安装harbor
    mysql-8安装教程(windows 64位)
    centos 7离线安装中文版GitLab
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8717545.html
Copyright © 2011-2022 走看看