(面试题)排序好的数组,比如说[1.2.3...n],可以构造多少个二叉搜索树(不一定是平衡的)?要求考虑时间与空间复杂度。

goldly 2008-07-09 10:07:50
一看这题,头都大了。

期望哪位给点提示???

多谢!
...全文
517 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
goldly 2008-07-14
  • 打赏
  • 举报
回复
发完就觉得不对,系统也不让修改。看花了眼了,多谢多谢tailzhou和dlyme。结贴了!
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 goldly 的回复:]
但是对于二叉搜索树,Catalan 函数显然是不成立的,例如,对于1,2,3,来说,可排列的二叉搜索树只有3种,而catalan函数却可以得到5种。实际上Catalan 数是n个nodes可以组合出的二叉树的数目,而非二叉搜索树。
[/Quote]

不要这么武断好不好?思考这么多天就得出个这样的结论来?

(1)
2
/ \
1 3

(2)
1
\
2
\
3

(3)
1
\
3
/
2

(4)
3
/
2
/
1

(5)
3
/
1
\
2
tailzhou 2008-07-14
  • 打赏
  • 举报
回复


 
1 1 2 3 3
\ \ / \ / /
2 3 1 3 2 1
\ / / \
3 2 1 2
tailzhou 2008-07-14
  • 打赏
  • 举报
回复
"对于1,2,3,来说,可排列的二叉搜索树只有3种,而catalan函数却可以得到5种"

怎么只有3种?

1 1 2 3 3
\ \ / \ / /
2 3 1 3 2 1
\ / / \
3 2 1 2
goldly 2008-07-14
  • 打赏
  • 举报
回复
Wikipedia: Catalan number
In combinatorial mathematics, the Catalan numbers form a sequence of natural numbers that occur in various counting problems, often involving recursively defined objects. They are named for the Belgian mathematician Eugène Charles Catalan (1814–1894).

The nth Catalan number is given directly in terms of binomial coefficients by


The first Catalan numbers (sequence A000108 in OEIS) for n = 0, 1, 2, 3, … are

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …

但是对于二叉搜索树,Catalan 函数显然是不成立的,例如,对于1,2,3,来说,可排列的二叉搜索树只有3种,而catalan函数却可以得到5种。实际上Catalan 数是n个nodes可以组合出的二叉树的数目,而非二叉搜索树。

哪里能够提供些新的想法???
goldly 2008-07-10
  • 打赏
  • 举报
回复
Anybody else???
tailzhou 2008-07-09
  • 打赏
  • 举报
回复
“似乎可以多建立一个数据结构在保存C(0),C(1),C(2)...C(n-1)的值,这样效率可能会高些。”
这就是dp的思想,效率高的多的;

直接递归是指数复杂度的;保存中间结果后是多项式复杂度的;

当然用通项式更好:
h(n)=c(2n,n)/(n+1)
goldly 2008-07-09
  • 打赏
  • 举报
回复
我上面程序的缺点是如果要计算Caculator(5)的话,那么我需要依次计算
Caculator(1)*Caculator(4)
Caculator(2)*Caculator(3)
Caculator(3)*Caculator(2)
Caculator(4)*Caculator(1)

而在计算Caculator(4)的时候又要调用Caculator(2),感觉效率实在太低下。

根据dlyme的提示,

这应该是Catalan数啊,C(n)表示n个元素可以构成的二叉搜索树个数,那么
C(0)=1
C(1)=1
C(2)=2
……
C(n)=C(0)*C(n-1)+C(1)*C(n-2)+C(2)*C(n-3)+...+C(n-1)*C(0)


似乎可以多建立一个数据结构在保存C(0),C(1),C(2)...C(n-1)的值,这样效率可能会高些。

大家怎么看这个问题呢???
goldly 2008-07-09
  • 打赏
  • 举报
回复
多谢tailzhou和dlyme,

面试的时候我不知道什么是Catalan数,听2位一说,我去baidu一下。果然应该是Catalan数。

中文:卡特兰数
原理:
令h(1)=1,catalan数满足递归式:
h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)
该递推关系的解为:
h(n)=c(2n,n)/(n+1) (n=1,2,3,...)

我当时写的程序如下:

int Caculator( int t)
{
if (t == 1)
return 1;

for(i=1; i<t; i++)
{
return Caculator(i-1)*Caculator(t-i);
}

}

我一直感觉不太对头,哪个大侠给指点下??
tailzhou 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tailzhou 的回复:]
这跟n个节点可以构成多少个不同形状的二叉树是一样的;

对每一个这样的二叉树,按照中序遍历的顺序依次添入数组的元素,那么该树就成为一个二叉搜索树;
[/Quote]

这还没说清楚么,对于每一个不同形状的二叉树B,对应于一个跟B相同结构的二叉搜索树;
  • 打赏
  • 举报
回复
是啊,那个calalan数列的第n项算出来就是这个值
goldly 2008-07-09
  • 打赏
  • 举报
回复
题目要求是求可以构成多少个二叉搜索树啊
  • 打赏
  • 举报
回复
呵呵,同时回的
  • 打赏
  • 举报
回复
这应该是Catalan数啊,C(n)表示n个元素可以构成的二叉搜索树个数,那么
C(0)=1
C(1)=1
C(2)=2
……
C(n)=C(0)*C(n-1)+C(1)*C(n-2)+C(2)*C(n-3)+...+C(n-1)*C(0)
tailzhou 2008-07-09
  • 打赏
  • 举报
回复
catalan数列的通项式为:
h(n)=c(2n,n)/(n+1) (n=1,2,3,...)
tailzhou 2008-07-09
  • 打赏
  • 举报
回复
n个节点可以构成的不同形状的二叉树的数目有
递推式:

s[0]=1;
s[1]=1;
...
s[i]=sum(s[j]*s[i-j-1]) 0<=j<=i-1;

这是一个catalan数列
tailzhou 2008-07-09
  • 打赏
  • 举报
回复
这跟n个节点可以构成多少个不同形状的二叉树是一样的;

对每一个这样的二叉树,按照中序遍历的顺序依次添入数组的元素,那么该树就成为一个二叉搜索树;
goldly 2008-07-09
  • 打赏
  • 举报
回复
谁能提供代码?

3ks

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧