我设计了一种生成完整二叉树的算法。我知道这个算法很糟糕,也有更好的解决方案,但我只是想知道下面的代码是否会采用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;
}
答案 0 :(得分:0)
您的算法似乎由GetDataByIndex
支配,为列表中的每个项目调用该算法。因此,GetDataByIndex
被称为2n
次,其本身的运行时间为O(n)
。因此,我会说这是一个O(n^2)
算法。
答案 1 :(得分:0)
由于您需要按索引访问值列表,为什么不将其复制到ArrayList中,以便按位置访问项目为O(1)。这将使整个树构建算法O(N),因为CreateTree为每个节点调用一次,并在每次调用中执行O(1)工作。