写得时候思路还是很清晰的,所以没花费多久便基本实现了,不过过程还是遇到一些bug。
版本1:
#include <iostream> #include <algorithm> #include <stack> #include <string> using namespace std; class tree { public: char val; tree * leftchild; tree * rightchild; }; class ExpressionTree { public: void build_expression(tree * & root, string str); void proorder_print(tree * root); void inorder_print(tree * root); void postorder_print(tree * root); void show(tree * root); void destory(tree * & root); }; void ExpressionTree::build_expression(tree * & root, string str) { stack<tree *> treestack; for (auto c : str) { tree*node = new tree; node->val = c; node->leftchild = nullptr; node->rightchild = nullptr; if (c >= ‘0‘ && c <= ‘9‘ || c >= ‘a‘ && c <= ‘z‘) treestack.push(node); else if (c == ‘+‘ || c == ‘-‘ || c == ‘*‘ || c == ‘/‘) { if (!treestack.empty()) { node->rightchild = treestack.top(); treestack.pop(); } if (!treestack.empty()) { node->leftchild = treestack.top(); treestack.pop(); } treestack.push(node); } else { cout << "表达式有误!" << endl; exit(1); } } root = treestack.top(); while (!treestack.empty()) treestack.pop(); } void ExpressionTree::proorder_print(tree * root) { if (root != nullptr) { cout << root->val; proorder_print(root->leftchild); proorder_print(root->rightchild); } } void ExpressionTree::inorder_print(tree * root) { if (root != nullptr) { cout << ‘(‘; inorder_print(root->leftchild); cout << root->val; inorder_print(root->rightchild); cout << ‘)‘; } } void ExpressionTree::postorder_print(tree * root) { if (root != nullptr) { postorder_print(root->leftchild); postorder_print(root->rightchild); cout << root->val; } } void ExpressionTree::show(tree * root) { cout << "前缀表达式:" << endl; proorder_print(root); cout << endl; cout << "中缀表达式:" << endl; inorder_print(root); cout << endl; cout << "后缀表达式:" << endl; postorder_print(root); cout << endl; } void ExpressionTree::destory(tree * & root) { if (root != nullptr) { destory(root->leftchild); destory(root->rightchild); delete root; } } int main() { string str = "23+456+**"; ExpressionTree res; tree * root; res.build_expression(root, str); res.show(root); res.destory(root); getchar(); return 0; }
版本2:
#include <iostream> #include <algorithm> #include <stack> #include <string> using namespace std; class tree { public: char val; tree * leftchild; tree * rightchild; }; class ExpressionTree { public: tree * root; ExpressionTree() { this->root = new tree; } ~ExpressionTree() { destory(this->root); } void insert(char c, stack<tree *> & treestack); void build_expression(string str); void proorder_print(tree * root); void inorder_print(tree * root); void postorder_print(tree * root); void show(); void destory(tree * root); }; void ExpressionTree::insert(char c, stack<tree *> & treestack) { tree*node = new tree; node->val = c; node->leftchild = nullptr; node->rightchild = nullptr; if (c >= ‘0‘ && c <= ‘9‘) treestack.push(node); else if (c == ‘+‘ || c == ‘-‘ || c == ‘*‘ || c == ‘/‘) { try { node->rightchild = treestack.top(); treestack.pop(); node->leftchild = treestack.top(); treestack.pop(); } catch (overflow_error) { cout << "表达式有误!"; exit(1); } treestack.push(node); } else { cout << "表达式有误!" << endl; exit(1); } } void ExpressionTree::build_expression(string str) { stack<tree *> treestack; for (auto s : str) insert(s, treestack); this->root = treestack.top(); while (!treestack.empty()) treestack.pop(); } void ExpressionTree::proorder_print(tree * root) { if (root != nullptr) { cout << root->val; proorder_print(root->leftchild); proorder_print(root->rightchild); } } void ExpressionTree::inorder_print(tree * root) { if (root != nullptr) { cout << ‘(‘; inorder_print(root->leftchild); cout << root->val; inorder_print(root->rightchild); cout << ‘)‘; } } void ExpressionTree::postorder_print(tree * root) { if (root != nullptr) { postorder_print(root->leftchild); postorder_print(root->rightchild); cout << root->val; } } void ExpressionTree::show() { cout << "前缀表达式:" << endl; proorder_print(this->root); cout << endl; cout << "中缀表达式:" << endl; inorder_print(this->root); cout << endl; cout << "后缀表达式:" << endl; postorder_print(this->root); cout << endl; } void ExpressionTree::destory(tree * root) { if (root != nullptr) { destory(root->leftchild); destory(root->rightchild); delete root; } } int main() { string str = "23+456+**"; ExpressionTree res; res.build_expression(str); res.show(); getchar(); return 0; }
基本思路:建立树的方式类似由下而上建立堆的办法,所以时间复杂度为O(n),这样算法就会变得很简单,只用考虑处理栈中的节点即可。好像也没什么好说的了。