Python——动态规划法 求不同的二叉搜索树最多有多少
作者:互联网
目录
引言
二叉搜索树又称二叉排序树,满足这样的条件:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
问题描述
给定一个整数 n,求以 1,2,… n 为节点组成的二叉搜索树有多少种
预期结果
case 1: return 1;
case 2: return 2;
case 3: return 5;
case 4: return 14;
case 5: return 42;
case 6: return 132;
case 7: return 429;
case 8: return 1430;
case 9: return 4862;
case 10: return 16796;
case 11: return 58786;
case 12: return 208012;
case 13: return 742900;
case 14: return 2674440;
case 15: return 9694845;
case 16: return 35357670;
case 17: return 129644790;
case 18: return 477638700;
case 19: return 1767263190;
思路分析
假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则
G(n) = f(1) + f(2) + f(3) + f(4) + ... + f(n)
当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-i,则
f(i) = G(i-1)*G(n-i)
综合两个公式可以得到 卡特兰数 公式
G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)
算法
class Solution:
def numTrees(self, n):
# 初始化大小为n+1的列表数组
G = [0]*(n+1)
G[0], G[1] = 1, 1
# range是左闭右开
for i in range(2, n+1):
for j in range(1, i+1):
G[i] += G[j-1] * G[i-j]
return G[n]
标签:case,结点,return,Python,右子,规划法,二叉,节点 来源: https://blog.csdn.net/WU2629409421perfect/article/details/112496785