3

根据这个问题,一定大小的不同搜索树的数量等于一个加泰罗尼亚数。是否可以枚举这些树?也就是说,有人可以实现以下两个功能:

Node* id2tree(int id); // return root of tree

int  tree2id(Node* root); // return id of tree

(我问是因为树的二进制代码(这个问题的答案之一)将是表示未知范围的任意大整数的非常有效的代码,即整数的可变长度代码

0 -> 0
1 -> 100
2 -> 11000
3 -> 10100
4 -> 1110000
5 -> 1101000
6 -> 1100100
7 -> 1011000
8 -> 1010100
etc

请注意,每个代码长度的整数个数是 1, 1, 2, 5,..(加泰罗尼亚语序列)。)

4

2 回答 2

2

应该可以将 id 转换为树并返回。

id 和位串是:

0 -> 0 
1 -> 100 
2 -> 11000 
3 -> 10100 
4 -> 1110000 
5 -> 1101000 
6 -> 1100100 
7 -> 1011000 
8 -> 1010100 

首先考虑一个事实,给定一个位串,我们可以很容易地移动到树(一种递归方法),反之亦然(预排序,输出 1 表示父节点,0 表示叶节点)。

主要挑战来自尝试将 id 映射到位串,反之亦然。

假设我们列出了 n 个节点的树如下:

Left sub-tree n-1 nodes, Right sub-tree 0 nodes. (Cn-1*C0 of them)
Left sub-tree n-2 nodes, Right sub-tree 1 node.  (Cn-2*C1 of them)
Left sub-tree n-3 nodes, right sub-tree 2 nodes. (Cn-3*C2 of them)
...
...
Left sub-tree 0 nodes, Right sub-tree n-1 nodes. (C0*Cn-1 of them)

Cr = rth catalan number.

您给出的枚举似乎来自以下过程:我们保持左子树固定,枚举右子树。然后移动到下一个左子树,枚举右子树,依此类推。我们从最大大小的左子树开始,然后下一个是最大大小-1,依此类推。

所以说我们有一个 id = S 说。我们首先找到一个 n 使得

C0 + C1 + C2 + ... + Cn < S <= C0+C1+ C2 + ... +Cn+1

那么 S 将对应于具有 n+1 个节点的树。

所以你现在考虑 P = S - (C0+C1+C2+ ...+Cn),它是在 n+1 个节点的树的枚举中的位置。

现在我们计算出一个 r 使得 Cn*C0 + Cn-1*C1 + .. + Cn-r Cr < P <= Cn C0 + Cn-1*C1 + .. + Cn-r+1*Cr-1

这告诉我们左子树和右子树有多少个节点。

考虑到 P - Cn*C0 + Cn-1*C1 + .. + Cn-r*Cr ,我们现在可以计算出精确的左子树枚举位置(仅考虑该大小的树)和精确的右子树枚举位置并递归形成位串。

将位串映射到 id 应该是类似的,因为我们知道左子树和右子树是什么样的,我们需要做的就是找到相应的位置并做一些算术来获得 ID。

不确定它有多大帮助。您将一直在处理一些非常庞大的数字。

于 2010-02-16T00:23:35.317 回答
0

对于一般(非搜索)二叉树,我可以看到这是如何可能的,因为在构建树时,每个节点都有三个选择(子节点的数量),仅受总达到 N 的限制。你可以找到一种方法将这样的树表示为一系列选择(通过以特定顺序构建树),并将该序列表示为 base-3 数字(或者可能更合适的可变基数)。

但是对于二叉搜索树,并不是所有的元素组织都是可以接受的。您还必须遵守数字排序约束。另一方面,由于向二叉搜索树的插入是明确定义的,因此您可以通过具有特定插入顺序的 N 个数字的列表来表示 N 个元素的整个树。通过将数字排列为不同的顺序,您可以生成不同的树。

排列当然很容易通过使用可变基数来计算:第一个项目有 N 个选择,第二个项目有 N-1 个,等等。这给了你一个 N 个数字序列,你可以将其编码为一个基数不等的数字N 到 1。从可变基数到二进制或十进制的编码和解码是从普通的固定基数转换算法改编而来的。(使用模数和除法运算的那些)。

因此,您可以将数字与排列转换,并且给定一个数字列表,您可以将(该列表的)排列从二叉搜索树转换为二叉搜索树。现在我认为你可以通过仅将整数 1 置换为 N 来获得所有可能的大小为 N 的二叉搜索树,但我并不完全确定,并试图证明这对于这篇文章来说有点过分。

我希望这是一个很好的讨论起点。

于 2009-09-27T11:59:04.330 回答