下午所有,递归创建一个数学表达式二叉树
我已经实现了在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'。 – svick 2011-03-27 13:55:15
此外,使用'List'这种方式效率很低。 –
svick
2011-03-27 14:03:12