Build a binary tree from an infix expression without using a stack
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Infix expressions are common in mathematical notation and many programming languages, reflecting the order in which operations are performed. However, to compute or process these expressions efficiently, they often need to be translated into tree structures such as binary trees. Binary trees provide a structured representation of expressions, allowing for easy traversal and evaluation. This article dives into constructing a binary tree directly from an infix expression without employing a stack, a common method for such tasks.
Understanding Infix Expressions and Binary Trees
Infix Expression
An infix expression is one where operators are placed between operands. For example, in the expression `A + B`, the `+` operator is between the operands `A` and `B`.
Why Use Binary Trees?
Binary trees are efficient structures for evaluating expressions due to their hierarchical nature. A binary tree for an infix expression assigns operators to parent nodes and operands to child nodes, making it straightforward to evaluate expressions recursively.
Constructing a Binary Tree Without a Stack
Typically, converting an infix expression to a binary tree involves parsing the expression and using an auxiliary data structure, like a stack, to manage operators and operands. However, we can accomplish the same task without using a stack by leveraging recursion and the properties of binary trees.
Recursive Approach for Construction
The idea is to recursively divide the expression into sub-expressions based on operator precedence and then build the tree bottom-up.
- Identify the Root Operator:
- Scan the expression to find the root operator, which is the operator with the lowest precedence that is not enclosed in parentheses. This root operator divides the expression into left and right subtrees.
- Handle Parentheses:
- Recursively process sub-expressions within parentheses as single entities. This involves counting matching parentheses and treating the contents as a separate expression.
- Recursive Division:
- For the root operator identified, recurse into the left and right sub-expressions. Construct nodes for each operator encountered and build left and right children accordingly.
- Node Construction:
- Construct binary tree nodes where each node contains an operator (for non-leaf nodes) or operand (for leaf nodes).
Example
Given the infix expression: `(A + B) * (C - D)`
- Detect Sub-expressions:
- Recognize `(A + B)` and `(C - D)` as isolated by parentheses.
- Root Operator:
- '*' is the root operator because it is the last separating operation when considering overall precedence and treating parentheses as single units.
- Sub-expressions as Nodes:
- Left Subtree: `A + B`
- Right Subtree: `C - D`
- Recursive Building:
- `+` becomes the root of the left subtree.
- `-` becomes the root of the right subtree.
- `A`, `B`, `C`, and `D` become leaf nodes.
The resulting binary tree would resemble:
- Operator Precedence:
- Parenthesis Handling:
- Edge Cases:
Related reading
- Build trie faster
- Building bridges problem - how to apply longest increasing subsequence?
- Byzantine Consensus Randomized - Monte Carlo Implementation with matrix for value sending
- C - code to order by a property using the property name as a string
- Build a graph that works with variable batch size using Tensorflow
- Build graph of organizational structure
- C algorithm for generating hierarchy
- C algorithm to calculate least common multiple for multiple numbers

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.