C++ program to construct an expression tree
In this tutorial, we will see how to construct an expression tree in C++. We will construct the tree from a given string of postfix expression. But first, let’s see what is an expression tree.
A tree in which the root is an operator and the children are operands is an expression tree. e.g.
(*)
/ \
(/) (-)
/ \ / \
(+) (+) F G
/ \ / \
A B C DIn the above tree, all the operands are connected through an operator which thus forms:
A + B / C + D * F - G // result
Algorithm
- We will call a function
constructTree()with postfix string, a stack of structure ExpressionTree’s pointer, size of string postfix and value 0 for iterator ‘i’. - In the constructTree() function we check one by one if the current character is operator or operand till ‘i’ is smaller than the size of the string.
- To check for operators we will pass the character to
isOperator()function which will check for different operators. - If the character is not an operator just push it into the stack ‘st’.
- Else we pop top two elements(which are operands or expressions) and put them into right and left subtree of the operator, and push the final expression back into the stack.
- Then we recursively call
constructTree()for the remaining elements. - When the string ends return the top of the stack as it contains the head of the expression tree.
- With the head obtained print the tree by calling
InorderPrint()function.
Implementation of the algorithm
Below is the full code implementing the algorithm:
#include<bits/stdc++.h>
using namespace std;
struct ExpressionTree
{
char value;
ExpressionTree* left, *right;
ExpressionTree(char x){
this->value =x;
this->left = this->right = NULL;
}
};
bool isOperator(char c)
{
if (c == '+' || c == '-' ||
c == '*' || c == '/')
return true;
return false;
}
void InorderPrint(ExpressionTree *head)
{
if(head)
{
InorderPrint(head->left);
cout<<head->value<<' ';
InorderPrint(head->right);
}
}
ExpressionTree* constructTree(string postfix ,stack<ExpressionTree*> &st,
int n,int i)
{
if(i>=n) return NULL;
if (!isOperator(postfix[i]))
{
ExpressionTree *temp = new ExpressionTree(postfix[i]);
st.push(temp);
}
else
{
ExpressionTree *temp = new ExpressionTree(postfix[i]);
temp->right = st.top();
st.pop();
temp->left = st.top();
st.pop();
st.push(temp);
}
constructTree(postfix,st,n,i+1);
return st.top();
//return head of ExpressionTree
}
int main()
{
string postfix = "AB+CD+/FG-*";
stack<ExpressionTree*> st;
ExpressionTree* head = constructTree(postfix,st,postfix.size(),0);
cout<<"Expression is : ";
InorderPrint(head);
return 0;
}
OUTPUT:
Expression is : A + B / C + D * F - G
The algorithm works in O(n) time complexity.
That’s it hope you understood.
Leave a Reply