LINTCODE——表达树的构造
思路:
首先,把中缀换成前缀或者后缀表达式;
然后,用计算前缀或者后缀表达式思路:
碰到数字:压入堆栈
碰到运算符:新建一个节点,左右分别指向出堆栈的两个,再压入堆栈;
最后,返回堆栈顶部元素;
/**
* Definition of ExpressionTreeNode:
* class ExpressionTreeNode {
* public:
* string symbol;
* ExpressionTreeNode *left, *right;
* ExpressionTreeNode(string symbol) {
* this->symbol = symbol;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param expression: A string array
* @return: The root of expression tree
*/
ExpressionTreeNode * build(vector<string> &expression) {
// write your code here
vector<string> sbegin = beginE(expression);
stack<ExpressionTreeNode *> res;
//相当于把前缀表达式的计算,换成了建立节点而已
for(auto x : sbegin )
{
if(cmp(x) == 0)
{
ExpressionTreeNode *temp = new ExpressionTreeNode(x);
res.push(temp);
}
else
{
//不是数字,先弹出两个,再压入堆栈
ExpressionTreeNode *temp = new ExpressionTreeNode(x);
temp -> left = res.top();
res.pop();
temp -> right = res.top();
res.pop();
res.push(temp);
}
}
return res.empty() ? NULL:res.top();
}
vector<string> beginE(vector<string> &stemp)
{
vector<string> sbegin;
stack<string> s;
int n = stemp.size();
for(int i = n-1; i>=0; i--)
{
if(cmp(stemp[i]) == 0)
sbegin.push_back(stemp[i]);
else if(stemp[i] == "(")
{
while(s.top() != ")")
{
sbegin.push_back(s.top());
s.pop();
}
s.pop();
}
else
{
while(true)
{
if(s.empty() || stemp[i] == ")" || s.top() == ")" || (cmp(stemp[i]) >= cmp(s.top())) )
{
s.push(stemp[i]);
break;
}
else
{
sbegin.push_back(s.top());
s.pop();
}
}
}
}
while(!s.empty())
{
sbegin.push_back(s.top());
s.pop();
}
return sbegin;
}
int cmp(string a)
{
switch (a[0]){
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
case '(':
return 3;
case ')':
return 3;
default:
return 0;
}
}
};