大家下午好,
我在C#中实现了一个简单的二叉树,我打算使用它来递归地创建数学表达式树。但我遇到了问题,因为多年来我没有进行递归调用,所以我很难理解为什么以下代码只适用于深度为2的二叉树而不是任意更深的树。
如果递归正确,那么它应该能够构建深度为n的树。这是代码:
Node<T> f;
Node<T> t;
Node<T> subRoot;
Node<T> root;
////Only works with trees of depth 2.
private Node<T> Tree(List<T> prefixBank, int maxDepth)
{
if (prefixBank.Count != 0)
{
if (maxDepth == 0)
{
t = new Node<T>(prefixBank[0]);
subRoot.Add(t);
prefixBank.Remove(prefixBank[0]);
}
else
{
if (root == null)
{
root = new Node<T>(prefixBank[0]);
prefixBank.Remove(prefixBank[0]);
Tree(prefixBank, maxDepth - 1);
}
f = new Node<T>(prefixBank[0]);
if (isOperator(f))
{
root.Add(f);
prefixBank.Remove(prefixBank[0]);
subRoot = f;
}
for (int i = 0; i < 2; i++)
{
Tree(prefixBank, maxDepth - 1);
}
}
}
return f;
}
上述函数接受一个字符列表,形成一个前缀数学表达式(例如
* + 3 4 - 5 6
)。令人恼火的是,我使用以下代码递归地创建前缀表达式:string prefixExpression = String.Empty;
private string generateExpression(Random rand, GenerationMethod generationMethod, int maxDepth)
{
if ((maxDepth == 0) || ((generationMethod == GenerationMethod.Grow) && (rand.NextDouble() < randomRate)))
{
operand.GenerateValue(Type.Terminal, rand);
prefixExpression += " " + operand.Value;
}
else
{
operator.GenerateValue(Type.Function, rand);
prefixExpression += " " + operator.GeneValue;
//2 is the arity of the function right an arity checker function so that unary operators can be utilised
for (int i = 0; i < 2; i++)
{
generateExpression(rand, generationMethod, maxDepth - 1);
};
}
return prefixExpression;
}
我尝试以与生成字符串相同的方式创建树,但无法以任何常识方式使其正常工作。我正在使用稍微修改过的二叉树类(在MSDN上找到)。我将其修改为具有自动添加到左侧或右侧子树的add函数,因此不必像此示例一样指定Root.Left.Left.Left等来创建树。
如果有人能帮助我纠正递归树创建代码,使其适用于n深度的树,我会非常感激。我对C#相对较新,因此如果以上内容有任何模糊之处,请谅解。
StringBuilder
而不是像您现在这样连接字符串。 - svickList<T>
的方式非常低效。 - svick