#include<iostream>
#include<stack>
#include<string>
using namespace std;
struct TreeNode {
char val;
TreeNode *left,*right;
TreeNode(char val) :val(val), left(nullptr), right(nullptr) {};
};
//根据后缀表达式构建二叉树
//s是后缀表达式,用字符串表示
TreeNode* buildTree(const string& s) {
//构建辅助栈
stack<TreeNode*> stk;
for (char c : s) {
//假设后缀表达式中的操作数都用小写字母表示
if (c >= 'a'&&c <= 'z') {
//利用构造函数构造值为操作数c的结点
TreeNode* newNode = new TreeNode(c);
//直接将操作数对应的树结点入栈
stk.push(newNode);
}
//如果c不是操作数,而是运算符
else {
//仍然把运算符存到新的树结点中
TreeNode* newNode = new TreeNode(c);
//从栈顶取出两个结点(这两个结点即新结点的左右孩子)
TreeNode *t1, *t2;
if (!stk.empty()) {
t1= stk.top();
stk.pop();
}
if (!stk.empty()) {
t2 = stk.top();
stk.pop();
}
newNode->left = t1;
newNode->right = t2;
//将连接好左右孩子的newNode入栈
stk.push(newNode);
}
}
return stk.top();
}
int main()
{
string s = "abc*d++";
TreeNode* root = buildTree(s);
//…………
return 0;
}
以上代码假设给出的后缀表达式是合法的。
基于栈构建二叉树,与后缀表达式求值的过程类似,只不过构建二叉树的栈保存的是结点而非操作数。