표현식 트리는 기본적으로 표현식을 나타내는 데 사용되는 이진 트리입니다. 표현식 트리에서 내부 노드는 연산자에 해당하고 각 리프 노드는 피연산자에 해당합니다. 다음은 inorder, preorder 및 postorder 순회에서 접두사 식에 대한 식 트리를 구성하는 C++ 프로그램입니다.
알고리즘
Begin class ExpressionTree which has following functions: function push() to push nodes into the tree: If stack is null then push the node as first element Else push the node and make it top function pop() to pop out nodes from the tree: If stack is null then print underflow Else Pop out the node and update top function insert() to insert characters: If it is digit then push it. Else if it is operator Then pop it. Else Print “invalid Expression” function postOrder() for postorder traversal: If tree is not empty postOrder(ptr->l) postOrder(ptr->r) Print root as ptr->d function inOrder() for inorder traversal: If tree is not empty inOrder(ptr->l) Print root as ptr->d inOrder(ptr->r) function preOrder() for preorder traversal: If tree is not empty Print root as ptr->d preOrder(ptr->l) preOrder(ptr->r) End
예시 코드
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; class TreeN//node declaration { public: char d; TreeN *l, *r; TreeN(char d) { this->d = d; this->l = NULL; this->r = NULL; } }; class StackNod// stack declaration { public: TreeN *treeN; StackNod *n; StackNod(TreeN*treeN)//constructor { this->treeN = treeN; n = NULL; } }; class ExpressionTree { private: StackNod *top; public: ExpressionTree() { top = NULL; } void clear() { top = NULL; } void push(TreeN *ptr) { if (top == NULL) top = new StackNod(ptr); else { StackNod *nptr = new StackNod(ptr); nptr->n = top; top = nptr; } } TreeN *pop() { if (top == NULL) { cout<<"Underflow"<<endl; } else { TreeN *ptr = top->treeN; top = top->n; return ptr; } } TreeN *peek() { return top->treeN; } void insert(char val) { if (isDigit(val)) { TreeN *nptr = new TreeN(val); push(nptr); } else if (isOperator(val)) { TreeN *nptr = new TreeN(val); nptr->l = pop(); nptr->r= pop(); push(nptr); } else { cout<<"Invalid Expression"<<endl; return; } } bool isDigit(char ch) { return ch >= '0' && ch <= '9'; } bool isOperator(char ch) { return ch == '+' || ch == '-' || ch == '*' || ch == '/'; } int toDigit(char ch) { return ch - '0'; } void buildTree(string eqn) { for (int i = eqn.length() - 1; i >= 0; i--) insert(eqn[i]); } void postfix() { postOrder(peek()); } void postOrder(TreeN*ptr) { if (ptr != NULL) { postOrder(ptr->l); postOrder(ptr->r); cout<<ptr->d; } } void infix() { inOrder(peek()); } void inOrder(TreeN *ptr) { if (ptr != NULL) { inOrder(ptr->l); cout<<ptr->d; inOrder(ptr->r); } } void prefix() { preOrder(peek()); } void preOrder(TreeN *ptr) { if (ptr != NULL) { cout<<ptr->d; preOrder(ptr->l); preOrder(ptr->r); } } }; int main() { string s; ExpressionTree et; cout<<"\nEnter equation in Prefix form: "; cin>>s; et.buildTree(s); cout<<"\nPrefix : "; et.prefix(); cout<<"\n\nInfix : "; et.infix(); cout<<"\n\nPostfix : "; et.postfix(); }
출력
Enter equation in Prefix form: ++7*626 Prefix : ++7*626 Infix : 7+6*2+6 Postfix : 762*+6+