欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

表达式树

程序员文章站 2022-05-19 21:08:40
...

表达式树

表达式树的树叶是操作数,如常数或变量,而其他的节点是操作符,如果所有的操作符均是二元的,则构成一棵二叉树。

表达式树的性质

中序遍历 —-> 中缀表达式
后序遍历 —-> 后缀表达式
先序遍历 —-> 前缀表达式

构造一棵表达式树

把后缀表达式转变成表达式树
(由于中缀表达式可以转换成后缀表达式,所以也可以实现将中缀表达式转换成后缀表达式,然后再构造相应的表达式树)

算法思想:
我们一次一个符号的读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树T1 和 T2(T1先弹出)并形成一棵新的树,该树的根就是操作符,它的左右儿子分别是T2和T1,然后将指向这颗新树的指针亚茹栈中。

<代码>


struct TreeNode{
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char x):val(x),left(NULL),right(NULL){}
};

TreeNode* createExpressTree(string str)
{
    if(str.empty())
        return NULL;
    stack<TreeNode*> Nodes;

    int len = str.size();
    for(int i = 0 ;i < len; i++)
    {
        if(str[i] >= 'a' && str[i] <= 'z')
        {
            TreeNode* node = new TreeNode(str[i]);
            Nodes.push(node);
        }
        else if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
        {
            TreeNode* node = new TreeNode(str[i]);
            if(Nodes.empty())
                return NULL;
            node->right = Nodes.top();
            Nodes.pop();
            if(Nodes.empty())
                return NULL;
            node->left = Nodes.top();
            Nodes.pop();

            Nodes.push(node);
        }
    }

    return Nodes.top();
}