表达式树

表达式树

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

表达式树的性质

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

构造一棵表达式树

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

算法思想:
我们一次一个符号的读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树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();
}
posted @ 2015-07-15 15:12  lanqiu5ge  阅读(171)  评论(0编辑  收藏  举报