【问题标题】:Binary Tree To Mathematical Expression二叉树转数学表达式
【发布时间】:2014-12-07 20:28:42
【问题描述】:

我有一棵包含数学表达式的二叉树。我使用数组将二叉树保存在内存中。 我将运算符(如 + 或 tan)保存为数组中的字符串。对于每个 i 节点,左节点索引为 2*i+1,右节点索引为 2*i+2。每个节点都可以是操作数或运算符。我想将二叉树转换为数学表达式,如字符串: "2+tan(tan(10))" 。 c#中如何将二叉树转换为数学表达式?

  +
 / \
2  tan
   / \               ===>      "2+tan(tan(10))"
 tan  
 / \ / \
10  

这是我的二叉树代码:

public class Tree
{
    private readonly List<Node> _nodes;

    public Tree(int size)
    {
        _nodes = new List<Node>();

        for (var i = 0; i < size; i++)
        {
            _nodes.Add(new Node(i, null));
        }

        for (var i = 0; i < size; i++)
        {
            if (2*i+1 > size-1 || 2*i+2 > size-1)
                break;

            _nodes[i].Left = _nodes[2*i + 1];
            _nodes[i].Right = _nodes[2*i + 2];
        }
    }
     ...
}

【问题讨论】:

    标签: c# math tree binary-tree binary-search-tree


    【解决方案1】:

    你可以递归来做——写一个返回字符串的方法,做这三件事:

    • 当两个子树都为空时,返回节点的内容
    • 当只有一个子树非空时,递归调用该方法,然后在括号中返回节点的内容,后面是递归调用的结果
    • 当两个子树都不为空时,对左子树和裂谷子树进行递归调用,并返回左结果,后跟该节点的内容,后跟右结果。

    【讨论】:

    • tnx,你能写出你的递归函数的伪代码吗?
    • 这称为中序树遍历。您必须记住,尽管各种运算符具有不同的优先级,并且在中缀表示法中您可能必须使用括号。
    • @ArMaN 我现在不能写伪代码,因为我在 iPhone 上 :) 不过,当我回到电脑上时,我也许可以写一些。
    • @Grx70 对,我假设优先级已经“融入”了树结构。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多