枚举搜索树

时间:2009-09-27 11:15:20

标签: algorithm tree binary-tree

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

id和bitstrings是:

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

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

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

假设我们列出了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说。我们首先找到一个这样的

C0 + C1 + C2 + ... + Cn < S&lt; = 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&lt; P <= Cn C0 + Cn-1 * C1 + .. + Cn-r + 1 * Cr-1

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

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

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

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

答案 1 :(得分:0)

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

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

排列当然可以通过使用变量基数来轻松计算:第一项有N个选择,第二项有N-1,等等。这给你一个N个数字的序列,你可以编码为一个数字从N到1变化的基数从可变基数到二进制或十进制的编码和解码可以从普通的固定基数转换算法中简单地改编。 (使用模数和除法运算的那些)。

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

我希望这是讨论的良好起点。