• leetcode之Unique Binary Search Trees


    题目描述:

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

    For example,
    Given n = 3, there are a total of 5 unique BST's.

       1         3     3      2      1
               /     /      /       
         3     2     1      1   3      2
        /     /                        
       2     1         2                 3

    给定一个数n, 计算从1, 到n 有多少种二叉查找树的结构.

    题解:
    看到这个题目,其实是没有想法的,直觉是n 和n-1之间肯定有某种联系。查看了网上的题解后,将自己的理解写下来:

    1. 对于从1到n 个数来说, 每一个数字都可以作为二叉查找树的根节点的。
    2. 当第i个数作为根节点时, 由二叉查找树的性质可以得到:其左边的数都小于i,右边的树都大于i。
      因此i为根节点时,左边的子树的取值范围为:k = 0~i-1, 右边子树的取值范围为 m = i+1 ~n
    3. 当左边子树0~i-1,其种类有d[i-1] 个,右边子树取值为 i+1 ~n 共有n-i-1个 其种类为d[n-i-1]依次为根节点时,
       注意:对于1,2,3 这三个数 和 4,5,6或者是7,8,9构成的子树种类是一样的 由此
    写成表达式为: d[i] = sum(d[k] * d[i-k-1]) 其中k取值为 0~i-1
    举个例子: 比如n=8
    1. 1为根节点时,左边子树的取值为0, 右边的取值范围为: 2~8 共7个数, 因此其种类与d[7] 是一样的 d[8-0-1]
    2. 2为根节点时,左边子树取值为1, 右边的取值为:3~ 8 与d[6] 是一样的, d[8-1-1]
    依次类推:
    初始条件: 当n= 0 时, d[0] = 1
          d[1] = d[0] = 1
          d[2] = d[0]*d[1] + d[1]*d[0]
    采用动态规划来解: 使用n维数组存储d[i]
    for i in range (1, n+1):
      for k in range (0, i):
        d[i] = d[i] + d[k]*d[i-k-1]
    return d[i]
    ~~~~~
  • 相关阅读:
    面试题15 链表中倒数第k个结点
    面试题14 调整数组顺序使奇数位于偶数前面
    面试题13 在O(1)时间删除链表结点
    面试题12 打印1到最大的N位数
    面试题11 数值的整数次方
    面试题10 二进制中1的个数
    面试题9 斐波那契数列
    面试题8 旋转数组的最小数字
    关于神经网络训练的一些建议笔记
    两篇将rf和boosting方法用在搜索排序上的paper
  • 原文地址:https://www.cnblogs.com/missmzt/p/5525798.html
Copyright © 2020-2023  润新知