【问题标题】:transform flat linear tree representation into memory tree representation将平面线性树表示转换为内存树表示
【发布时间】:2018-09-08 03:39:36
【问题描述】:

我有一个这样的字符串:

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

这里的表达式例如是:

*

Terminal表示节点是否为终端节点(b,a,a,a)。

我正在尝试提出一种算法来创建给定字符串的树。任何帮助将不胜感激。谢谢!

为了提供更多上下文,这与此paper 相关。

PS:

另一个例子:

Q*+-abcd

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

【问题讨论】:

  • 谢谢亨克。不是100%你的意思。我添加了另一个示例(请参阅 PS)。这里左边的节点不是终端。
  • 但是第二个例子不是表达式树。为什么 Q 会成为 * 的父级,这甚至意味着什么?
  • Q 是平方根。我补充一下意思。
  • 对。然后查找“前缀解析器”。
  • 有点像二叉堆,但不完全是。

标签: c# binary-tree expression-trees genetics


【解决方案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"));

【讨论】:

  • 这看起来很有趣 - 谢谢。请花点时间测试一下。
  • 很酷。我对其进行了调整以更接近我的用例并且它有效(不确定如何)。我尝试使用递归等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多