不同的二叉查找树

题目描述:给出 n,问由 1…n 为节点组成的不同的二叉查找树有多少种?

样例:给出n = 3,有5种不同形态的二叉查找树:

《不同的二叉查找树》


二叉查找树的特点是任何一个节点左子树的节点值都小于这个节点,右子树的节点值都大于这个节点。根据这个规律,我们来分析:

设置一个一维数组record来保存n在不同的值时,不同的BST(二叉查找树)的数量

1. n = 0,没有节点,只有空树一种情况,record[0] = 1

2. n = 1,record[0] = 1

3. n = 2,若以1为根节点,则根节点的左子树只能为空,右子树中只有2一个节点,所以,根据排列组合原理,record[2] = record[0] * record[1]

4. 再写一步,n = 3, record[3] = record[0] * record[2](以1为根节点),record[3] = record[1] * record[1](以2为根节点),record[3] = record[2] * record[0](以3为根节点


这样,能得到动态规划的最优子结构了:record[i] = record[0] * record[i – 1] + record[1] * record[i – 2] + ……+ record[i – 1] record[0] 

这是一个数列的求和,数列的每一项为record[j] * record[i – 1 – j],其中j ∈[0, 1, 2 ,…, j – 1]

写出代码即可:

class Solution:
    # @paramn n: An integer
    # @return: An integer
    def numTrees(self, n):
        record = [0 for i in range(n + 1)]
        record[0] = 1
        i = 1
        while i <= n:
            j = 0
            while j < i:
                record[i] += record[j] * record[i - 1 - j]
                j += 1
            i += 1
        return record[n]
        # write your code here


    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/guoziqing506/article/details/51761960
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞