LINTCODE——表达树的构造

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;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值