【发布时间】:2011-07-23 21:09:44
【问题描述】:
下午好,
我已经用 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;
}
我尝试以与生成字符串相同的方式创建树,但无法使其以任何常识方式工作。我正在使用binary tree class found on MSDN 的略微修改版本。我对其进行了修改,使其具有自动添加到左子树或右子树的添加功能,因此我不必像此示例那样指定 Root.Left.Left.Left 等来创建树。
如果任何人可以帮助我更正我的递归树创建代码,使其适用于 n 深度的树,我将不胜感激。我对 C# 比较陌生,所以如果上面的内容有点粗略,我深表歉意。
【问题讨论】:
-
与您的问题无关,但不要像您那样连接字符串,您应该使用
StringBuilder。 -
另外,使用
List<T>这种方式效率非常低。
标签: c# parsing data-structures recursion