如何在内存中表示二叉树

时间:2012-02-18 13:16:29

标签: language-agnostic data-structures

我有这样的结构,被描述为“二叉树”。让我们看一幅画: enter image description here

哪种方式可以在内存中表现出来?只是为了澄清,不是一个简单的二叉树,因为节点N4既是N1的左子节点又是N2的右子节点,N7和N8也是如此共享......我需要一种易于避免的构造算法复制这些节点,但只是引用它们。

更新 我们中的许多人不同意“二叉树定义”,但这来自金融(特别是衍生品定价),请看这里:http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter45.html。所以我使用了“域名加入定义”。

2 个答案:

答案 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)。