首页 > 编程语言 >不同的二叉搜索树的种数数量 C/C++ 动态规划

不同的二叉搜索树的种数数量 C/C++ 动态规划

时间:2022-09-25 21:33:10浏览次数:53  
标签:int 个数 sum2 C++ 二叉 种数 sum1 Gemm

#if 0 class Solution { public:     int numTrees(int n) {         vector<int> s(n+1);   // 取值范围有n个数,取n个数范围内的任意一个树做根节点的二叉搜索树的种数的和         /** 那么对于任意数 i 做 根节点,那么 i 的左侧 有i-1个数,这么多数会有s[i-1] 种二叉树,右侧有 j-i 个数,有s[j-i]种二叉树的排列方式,         将两者相乘,然后累加不同取值i时的情况,就得到递推公式         **  有递推公式 S[j] = 累加{sum[i-1] * sum[j-i]} ,1<=i<=j , 1<=j<=n  i 为不同的根节点的取值,j 为数的多少         **/         //初始化数组         s[0] = 1;  //表示没有数据时的二叉树的种数,很显然,这也属于一种情况,只有一个数的二叉树的种数为1.         s[1] = 1;         for(int j = 2; j <=n ; j++){             for(int i = 1; i <= j;i++){                 s[j] +=s[i-1] * s[j-i];             }         }         return s[n];     } }; #endif
#if 0 class Solution { public:     int numTrees(int n) {         vector<vector<int>> Gemm(n+1,vector<int>(n+1,0));  // i, j  表示根节点取i值时,二叉搜索树有 j 个数二叉搜索的种数         /**需要的结果是根节点取值为所有n个数范围内的任意一个数i的二叉树的种树的和         **即需要 累加{Gemm[i][n]}  1<=i<=n         ** 每一个Gemm[i][j] = 累加{Gemm[k][i-1]}  *  累加{Gemm[l][j-i]}         * 所以 递推式是Gemm[i][j]}  = 累加{Gemm[k][i-1]} * 累加{Gemm[l][j-i]}   1<=i<=j ; 1<=j<=n; 1<=k<=i; 1<=l<=j-i;         **          **/         //初始化数组         Gemm[1][1] = 1;         Gemm[1][0] = 1;         for(int j = 1; j <=n ; j++){             for(int i = 1; i <= j;i++){                     int sum1=0,sum2=0;                 for(int k = 1; k<=i-1;k++){                     sum1+=Gemm[k][i-1];                 }                 for(int l = 1; l<=j-i;l++){                     sum2+=Gemm[l][j-i];                 }                 if(!sum1) sum1 = 1;                 if(!sum2) sum2 = 1;                 Gemm[i][j] = sum1*sum2;             }         }         int sum0=0;         for(int i = 1; i<= n;i++){             sum0+=Gemm[i][n];         }         return sum0;     } }; #endif
#if 1 class Solution { public:     int numTrees(int n) {         vector<vector<int>> Gemm(n+1,vector<int>(n+1,0));  // i, j  表示根节点取i值时,二叉搜索树有 j 个数二叉搜索的种数         /**         * 递推式是Gemm[i][j]}  = 累加{Gemm[k][i-1]} * 累加{Gemm[l][j-i]}   1<=i<=j ; 1<=j<=n; 1<=k<=i; 1<=l<=j-i;         ** 如果这样会有j,i,(k,l) 三层变量的变化,会有三层循环,时间复杂度在n3 但是对于大多数 累加{Gemm[k][i-1]} 和 累加{Gemm[l][j-i]} 都已经计算过,想办法把它们保存下来,使用一个S[j] 来保存 有j个数的二叉树的种数。         **/         //初始化数组         vector<int> S(n+1);         Gemm[1][1] = 1;         Gemm[1][0] = 1;         S[0] = 1;         S[1] = 1;         for(int j = 1; j <=n ; j++){             for(int i = 1; i <= j;i++){                     int sum1=0,sum2=0;                 if(S[i-1]) sum1 = S[i-1];                 else{                     for(int k = 1; k<=i-1;k++){                         sum1+=Gemm[k][i-1];                     }                 }                 if(S[j-i]) sum2 = S[j-i];                 else{                     for(int l = 1; l<=j-i;l++){                         sum2+=Gemm[l][j-i];                     }                 }                 if(!sum1) sum1 = 1;                 if(!sum2) sum2 = 1;                 Gemm[i][j] = sum1*sum2;             }         }         int sum0=0;         for(int i = 1; i<= n;i++){             sum0+=Gemm[i][n];         }         return sum0;     } }; #endif

标签:int,个数,sum2,C++,二叉,种数,sum1,Gemm
From: https://www.cnblogs.com/daniel123/p/16729028.html

相关文章

  • 二叉树的最大深度
    二叉树的最大深度一、题目描述给定一个二叉树,找出其最大深度。二叉树的最大深度为根节点到最远叶子节点的最长路径上的节点数。叶子节点时没有字节点的。实例:给定二叉......
  • C++ 自学笔记 访问限制 Setting limits
    Settinglimits  让客户不能改,让设计者可以改 C++:  任何人访问成员函数访问(同一个类的不同实例化对象可以相互访问私有成员变量)类自己或子类访问 friend......
  • C++ 自学笔记 new和delete(动态内存分配)
    动态内存分配DynamicmemoeyallocationC++使用new和delete来申请和释放内存new:先申请一个空间int\Stash:默认构造函数初始化对象~:析构函数析构delete:再释放空间......
  • C++期末考试题库
    哈尔滨商业大学计算机专业C++期末考试题库下载:题库示例:一、单选题:1.能作为C++程序的基本单位是(C)A.字符B.语句C.函数D.源程序文件2.程序中主函数的名字为......
  • 【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法
    【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法 前言:此文章主要用于提供方法与思路,fps游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文......
  • C/C++ 关于默认构造函数
    前言:在C++中,对于一个类,C++的编译器都会为这个类提供四个默认函数,分别是:A()//默认构造函数~A()//默认析构函数A(constA&)//默认拷贝构造函数A&operator=(const......
  • C++ 自学笔记 对象的初始化
    数组的初始化:  在C++中 struct≈Class;struct里面可以有函数。 默认构造函数:没有参数的构造函数就是默认构造函数 ......
  • 平衡二叉树(AVL)的插入和删除
    在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是......
  • 候捷-C++程序设计(Ⅱ)兼谈对象模型
    目录笔记参考学习目标转换函数与explicitpointer-likeclassesfunction-likeclasses模板template模板特化与偏特化模板模板参数引用(reference)关于虚指针(vptr)和虚表(vtbl)关......
  • C++自学笔记 构造与析构;
    构造与析构类不是实体;对象属于类;函数属于类;用不同的对象调用同一个类里面的函数的时候,函数知道是哪一个对象在调用它 关键字thisthis是一个指针 Pointa;a.pri......