如何在内存中表示二叉树
我有这样的结构,被描述为“二叉树”。让我们看看一张图: 如何在内存中表示二叉树
这是在内存中表示这种最好的方法吗?只是为了澄清,不是一个简单的二叉树,因为节点N4既是N1的左子节点又是N2的右子节点,N7和N8发生了相同的共享,等等......我需要一个构建算法,它很容易避免复制这样的节点,但只是参考它们。
UPDATE 我们很多人不符合“二叉树deefinition”同意,但来自金融(expecially衍生产品定价)这个卡梅斯看看这里:http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter45.html例如。所以我使用了“Domain acceted definition”。
您可以按级别生成结构级别。在每次迭代中,创建一个级别的节点,将它们放在一个数组中,并将之前的级别连接到它们。像这样(C#):
Node GenerateStructure(int levels)
{
Node root = null;
Node[] previous = null;
for (int level = 1; level <= levels; level++)
{
int count = level;
var current = new Node[count];
for (int i = 0; i < count; i++)
current[i] = new Node();
if (level == 1)
root = current[0];
for (int i = 0; i < count - 1; i++)
{
previous[i].Left = current[i];
previous[i].Right = current[i + 1];
}
previous = current;
}
return root;
}
整个结构需要O(N^2)存储器,其中N为级的个数。这种方法需要两个阵列的O(N)附加内存。另一种方法是从左到右生成图形,但这也需要O(N)个额外的内存。
时间复杂度显然是O(N^2)。
不止一棵树,其中我会给出一个定义,如'N顶点和N-1边的连通图',该结构看起来像帕斯卡(或意大利教导的塔尔塔利亚)triangle。因此,具有合适索引的阵列就足够了。
施工细节取决于您的数据输入:请给出一些更多的提示。
好的Tartaglia三角形可能是通过索引基于三角形水平的某个索引中的节点的方式。 – 2012-02-18 14:37:09
这甚至不是一棵树。实际的[二叉树](http://en.wikipedia.org/wiki/Binomial_tree#Binomial_tree)看起来不同。 – svick 2012-02-18 13:20:09
另外,“最好”是什么意思?你在找什么?代码可读性?内存占用?性能?是不是一个简单的类型,'左'和'右'引用足够? – svick 2012-02-18 13:22:22
@svick以及我的意思是生成它的方式没有复制节点... – 2012-02-18 13:44:27