表达式树
表达式树
表达式树的树叶是操作数,如常数或变量,而其他的节点是操作符,如果所有的操作符均是二元的,则构成一棵二叉树。
表达式树的性质
中序遍历 —-> 中缀表达式
后序遍历 —-> 后缀表达式
先序遍历 —-> 前缀表达式
构造一棵表达式树
把后缀表达式转变成表达式树
(由于中缀表达式可以转换成后缀表达式,所以也可以实现将中缀表达式转换成后缀表达式,然后再构造相应的表达式树)
算法思想:
我们一次一个符号的读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树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();
}