我有这样的结构,被描述为“二叉树”。让我们看一幅画:
哪种方式可以在内存中表现出来?只是为了澄清,不是一个简单的二叉树,因为节点N4既是N1的左子节点又是N2的右子节点,N7和N8也是如此共享......我需要一种易于避免的构造算法复制这些节点,但只是引用它们。
更新 我们中的许多人不同意“二叉树定义”,但这来自金融(特别是衍生品定价),请看这里:http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter45.html。所以我使用了“域名加入定义”。
答案 0 :(得分:1)
不仅仅是一棵树,我会给出一个像'N顶点和N-1边的连通图'这样的定义,这个结构看起来像Pascal(或Tartaglia,在意大利教过)triangle。因此,具有合适索引的数组就足够了。
构造细节取决于您的数据输入:请提供更多提示。
答案 1 :(得分:1)
您可以逐级生成结构。在每次迭代中,创建一个级别的节点,将它们放在一个数组中,并将前一级别连接到它们。这样的事情(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)。