编程语言
首页 > 编程语言> > Python——动态规划法 求不同的二叉搜索树最多有多少

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