我有一个这样的字符串:
*b+a-aQa
并希望将其转换为这样的分层树结构:
树将包含如下节点:
public class TreeNode : ITreeNode
{
public string Expression { get; set; }
public bool Terminal { get; set; }
public List<ITreeNode> Children { get; set; }
}
public interface ITreeNode
{
string Expression { get; set; }
bool Terminal { get; set; }
List<ITreeNode> Children { get; set; }
}
这里的表达式例如是:
*
终端指示节点是否是终端节点(b,a,a,a)。
我正在尝试用算法来创建给定字符串的树。任何帮助将非常感谢。谢谢!
要提供更多上下文,这与此paper。
相关PS:
另一个例子:
Q*+-abcd
这个含义如下(Q =平方根):
答案 0 :(得分:1)
它有点像二进制堆,但并不完全。添加节点时,您知道结构(0,1或2个子节点),但之后您只能读取子节点的内容。
您可以使用队列而不是堆栈来管理它
private static Node Parse(TextReader reader)
{
var nodes = new Queue<Node>();
var root = new Node();
nodes.Enqueue(root);
int ch;
while ((ch = reader.Read()) != -1)
{
char token = (char)ch;
// syntax check 1: the queue should not be empty
var node = nodes.Dequeue();
node.Symbol = token;
if ("Q".IndexOf(token) >= 0)
{
node.Left = new Node();
nodes.Enqueue(node.Left);
}
else if ("+-*".IndexOf(token) >= 0)
{
node.Left = new Node();
nodes.Enqueue(node.Left);
node.Right = new Node();
nodes.Enqueue(node.Right);
}
// else : 0 children
}
// syntax check 2: the queue should now be empty
return root;
}
你可以称之为
var tree = Parse(new StringReader("Q*+-abcd"));