博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Unique Binary Search Trees, Solution
阅读量:7264 次
发布时间:2019-06-29

本文共 1416 字,大约阅读时间需要 4 分钟。

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
[Thoughts]
这题想了好久才想清楚。其实如果把上例的顺序改一下,就可以看出规律了。
 1                1                      2                       3             3
    \                 \                 /      \                  /              /
      3               2              1       3               2             1
    /                   \                                       /                  \
 2                       3                                   1                    2
比如,以1为根的树有几个,完全取决于有二个元素的子树有几种。同理,2为根的子树取决于一个元素的子树有几个。以3为根的情况,则与1相同。
定义Count[i] 为以[0,i]能产生的Unique Binary Tree的数目,
如果数组为空,毫无疑问,只有一种BST,即空树,
Count[0] =1
如果数组仅有一个元素{1},只有一种BST,单个节点
Count[1] = 1
如果数组有两个元素{1,2}, 那么有如下两种可能
1                       2
  \                    /
    2                1
Count[2] = Count[0] * Count[1]   (1为根的情况)
                  + Count[1] * Count[0]  (2为根的情况。
再看一遍三个元素的数组,可以发现BST的取值方式如下:
Count[3] = Count[0]*Count[2]  (1为根的情况)
               + Count[1]*Count[1]  (2为根的情况)
               + Count[2]*Count[0]  (3为根的情况)
所以,由此观察,可以得出Count的递推公式为
Count[i] = ∑ Count[0...k] * [ k+1....i]     0<=k<i-1
问题至此划归为一维动态规划。
[Code]
1:       int numTrees(int n) {  2:            vector
count(n+1, 0); 3: count[0] =1; 4: count[1] =1; 5: for(int i =2; i<=n; i++) 6: { 7: for(int j =0; j
[Note]
这是很有意思的一个题。刚拿到这题的时候,完全不知道从那下手,因为对于BST是否Unique,很难判断。最后引入了一个条件以后,立即就清晰了,即
当数组为 1,2,3,4,.. i,.. n时,基于以下原则的BST建树具有唯一性:
以i为根节点的树,其左子树由[0, i-1]构成, 其右子树由[i+1, n]构成。

转载于:https://www.cnblogs.com/codingtmd/archive/2013/03/21/5078889.html

你可能感兴趣的文章
实操总结:小程序裂变0成本获客3要素
查看>>
性能测试流程剖析
查看>>
Lync server 2013 监控角色的安装
查看>>
什么是分区表?为什么要用分区表?如何创建分区表?
查看>>
Android 反编译
查看>>
深入浅出理解索引结构
查看>>
MySQL :: MySQL 5.0 Reference Manual :: 20.6.16.1 Problems Linking to the MySQL Client Library
查看>>
hdu_1059_多重背包
查看>>
bat 命令行方式生成带有日期的MSSQL数据库备份文件
查看>>
Web 开发最有用的50款 jQuery 插件集锦——《内容滑块篇》
查看>>
C# 温故知新 基础篇(2) 运算符和控制流<思维导图>
查看>>
android学习笔记---33_为应用添加多个Activity与参数传递
查看>>
[转]代码管理技巧——两步创建本地SVN服务器图文教程
查看>>
js replace 与replaceall实例用法详解
查看>>
HDU1106
查看>>
C++ STL算法系列3---求和:accumulate
查看>>
JS函数重载解决方案
查看>>
用Spring提高java观察者模式灵活性
查看>>
两个div横向排列,顶端对齐的方式。
查看>>
android string.xml里的空格字符
查看>>