Given a string representing infix notation. The task is to convert it to an expression tree.
Expression Tree is a binary tree where the operands are represented by leaf nodes and operators are represented by intermediate nodes. No node can have a single child.
Construction of Expression tree
The algorithm follows a combination of shunting yard along with postfix-to-expression tree conversion.
Consider the below line:
((s[i]!=’^’ && p[stC.top()]>=p[s[i]]) || (s[i]==’^’ && p[stC.top()]>p[s[i]])))
You might remember that unlike ‘+’, ‘-‘, ‘*’ and ‘/’; ‘^’ is right associative.
In simpler terms, a^b^c is a^(b^c) not (a^b)^c. So it must be evaluated from the right.
Now lets take a look at how does the algorithm work,
Let us have an expression s = ((a+b)*c-e*f) currently both the stacks are empty- (we'll use C to denote the char stack and N for node stack) s = '(' ((a+b)*c-e*f) ^ C|(|, N| | s = '(' ((a+b)*c-e*f) ^ |(| C|(|, N| | s = 'a' ((a+b)*c-e*f) ^ |(| C|(|, N|a| s = '+' ((a+b)*c-e*f) ^ |+| |(| C|(|, N|a| s = 'b' ((a+b)*c-e*f) ^ |+| |(| |b| C|(|, N|a| s = ')' ((a+b)*c-e*f) ^ |+| t = '+' + |(| |b| -> t1= 'b' / \ -> C|(|, N|a| t2= 'a' a b C|(|, N|+| s = '*' ((a+b)*c-e*f) ^ |*| C|(|, N|+| s = 'c' ((a+b)*c-e*f) ^ |*| |c| C|(|, N|+| s = '-' ((a+b)*c-e*f) now (C.top(*)>(-)) ^ t = '*' * |*| |c| t1 = c / \ -> |-| C|(|, N|+| t2 = + + c C|(|, N|*| / \ a b s = 'e' ((a+b)*c-e*f) ^ |-| |e| C|(|, N|*| s = '*' ((a+b)*c-e*f) now (C.top(-)>(*)) ^ |*| |-| |e| C|(|, N|*| s = 'f' ((a+b)*c-e*f) ^ |*| |f| |-| |e| C|(|, N|*| s = ')' ((a+b)*c-e*f) 1> ^ |*| |f| t = '*' * |-| |e| -> t1= 'f' -> / \ -> |-| |*| C|(|, N|*| t2= 'e' e f C|(|, N|*| 2> t = '-' - |-| |*| -> t1= 'f' -> / \ -> C|(|, N|*| t2= 'e' * * C| |, N|-| / \ / \ + c e f / \ a b now make (-) the root of the tree
Below is the implementation of the above approach:
The time Complexity is O(n) as each character is accessed only once.
The space Complexity is O(n) as (char_stack + node_stack) <= n
Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.
- Convert Infix To Prefix Notation
- Convert Ternary Expression to a Binary Tree
- Convert ternary expression to Binary Tree using Stack
- Building Expression tree from Prefix Expression
- Expression Tree
- Evaluation of Expression Tree
- Convert a Binary Search Tree into a Skewed tree in increasing or decreasing order
- Convert an arbitrary Binary Tree to a tree that holds Children Sum Property
- Convert a given Binary tree to a tree that holds Logical OR property
- Convert a given Binary tree to a tree that holds Logical AND property
- Convert a Binary Tree into its Mirror Tree
- Minimum swap required to convert binary tree to binary search tree
- Convert a Binary Tree to Threaded binary tree | Set 2 (Efficient)
- Convert a Binary Tree to Threaded binary tree | Set 1 (Using Queue)
- Convert Directed Graph into a Tree
- Convert a tree to forest of even nodes
- Convert a given tree to its Sum Tree
- Convert left-right representation of a binary tree to down-right
- Postfix to Infix
- Convert a given Binary Tree to Doubly Linked List | Set 1
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to email@example.com. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.