表达式树

来源:互联网 发布:金融数据分析师工资 编辑:程序博客网 时间:2024/05/16 19:22

表达式树

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

表达式树的性质

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

构造一棵表达式树

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

算法思想:
我们一次一个符号的读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树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();}
0 0
原创粉丝点击