C# 将平面线性树表示转换为内存树表示

C# 将平面线性树表示转换为内存树表示,c#,binary-tree,expression-trees,genetics,C#,Binary Tree,Expression Trees,Genetics,我有这样一个字符串: *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 Expressi

我有这样一个字符串:

*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-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-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; }
}

其含义如下(Q=平方根):


它有点像二进制堆,但不完全是。添加节点时,您知道其结构(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;         
}

谢谢你,亨克。不是你说的100%。我添加了另一个示例(参见PS)。这里左边的节点不是终端,但第二个例子不是表达式树。为什么Q会成为*,这意味着什么?Q是平方根。我来补充一下,好的。然后查找“前缀解析器”。它有点像二进制堆,但不完全是。这看起来很有趣-谢谢。请给我一点时间测试一下。很酷。我调整了它,使之更接近我的用例,并且它可以工作(不确定如何工作)。我尝试使用递归等。