编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)并保证该树一定是表达式树
时间: 2024-03-23 15:44:07 浏览: 103
以下是一个读入先序遍历字符串并建立表达式树的示例程序。假设输入的先序遍历字符串中仅包含数字和运算符(+、-、*、/),且每个数字和运算符之间用空格隔开。
```c++
#include <iostream>
#include <string>
#include <stack>
using namespace std;
// 表达式树节点的结构体
struct TreeNode {
char val; // 节点的值,可能是数字或运算符
TreeNode* left; // 左子树指针
TreeNode* right; // 右子树指针
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
// 读入先序遍历字符串并建立表达式树
TreeNode* buildExpressionTree(string& s) {
stack<TreeNode*> st; // 栈用于存储节点
for (int i = s.size() - 1; i >= 0; i--) { // 从后往前遍历字符串
char c = s[i];
if (isdigit(c)) { // 如果是数字,创建节点并入栈
st.push(new TreeNode(c));
} else if (c == '+' || c == '-' || c == '*' || c == '/') { // 如果是运算符,创建节点并入栈
TreeNode* node = new TreeNode(c);
node->left = st.top();
st.pop();
node->right = st.top();
st.pop();
st.push(node);
}
}
return st.top(); // 栈顶节点即为根节点
}
// 中序遍历输出表达式树
void inorderTraversal(TreeNode* root) {
if (root) {
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
}
int main() {
string s;
cout << "请输入先序遍历字符串:";
getline(cin, s);
TreeNode* root = buildExpressionTree(s);
cout << "表达式树的中序遍历结果为:";
inorderTraversal(root);
cout << endl;
return 0;
}
```
示例输入:
```
+ 3 * 4 5
```
示例输出:
```
表达式树的中序遍历结果为:3 + 4 * 5
```
阅读全文