有人在最坏的情况下计算树创建算法的运行时间吗?

时间:2015-07-30 00:49:56

标签: algorithm tree

我设计了一种生成完整二叉树的算法。我知道这个算法很糟糕,也有更好的解决方案,但我只是想知道下面的代码是否会采用O(n),O(n * n!)或O(nlogn)。

我使用了一个链表。

    public LinkedData GetDataByIndex(LinkedData list, int index)
    {
        for (int i = 0; i < index; i++)
        {
            if (list.Next == null)
                return null;
            list = list.Next;
        }
        return list;
    }

    public TreeNode CreateTree(TreeNode node, LinkedData list, int index)
    {
        if (index == 0) //root
        {
            node = new TreeNode();
            node.Value = list.Value;
        }
        //Left
        int leftIndex = index*2 + 1;
        LinkedData data = GetDataByIndex(list, leftIndex);
        if (data != null)
        {
            node.Left=new TreeNode();
            node.Left.Value = data.Value;
            CreateTree(node.Left, list, leftIndex);
        }

        //Right
        int rightIndex = index*2 + 2;
        data = GetDataByIndex(list, rightIndex);
        if (data != null)
        {
            node.Right=new TreeNode();
            node.Right.Value = data.Value;
            CreateTree(node.Right, list, rightIndex);
        }

        return node;
    }

2 个答案:

答案 0 :(得分:0)

您的算法似乎由GetDataByIndex支配,为列表中的每个项目调用该算法。因此,GetDataByIndex被称为2n次,其本身的运行时间为O(n)。因此,我会说这是一个O(n^2)算法。

答案 1 :(得分:0)

由于您需要按索引访问值列表,为什么不将其复制到ArrayList中,以便按位置访问项目为O(1)。这将使整个树构建算法O(N),因为CreateTree为每个节点调用一次,并在每次调用中执行O(1)工作。