Boundary Traversal of Binary Tree in DSA C - Time & Space Complexity
We want to know how the time to do a boundary traversal changes as the tree gets bigger.
Specifically, how many steps does it take to visit the edges of the tree?
Analyze the time complexity of the following code snippet.
void printBoundary(Node* root) {
if (!root) return;
if (root->left || root->right) printf("%d ", root->data);
printLeftBoundary(root->left);
printLeaves(root);
printRightBoundary(root->right);
}
void printLeftBoundary(Node* node) {
if (!node || (!node->left && !node->right)) return;
printf("%d ", node->data);
if (node->left) printLeftBoundary(node->left);
else printLeftBoundary(node->right);
}
void printLeaves(Node* node) {
if (!node) return;
printLeaves(node->left);
if (!node->left && !node->right) printf("%d ", node->data);
printLeaves(node->right);
}
void printRightBoundary(Node* node) {
if (!node || (!node->left && !node->right)) return;
if (node->right) printRightBoundary(node->right);
else printRightBoundary(node->left);
printf("%d ", node->data);
}
This code prints the boundary nodes of a binary tree in anti-clockwise order: left edge, leaves, then right edge.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive traversal of nodes to print left boundary, leaves, and right boundary.
- How many times: Each node is visited at most once during these traversals.
As the number of nodes (n) grows, the code visits each node once in worst case.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits |
| 100 | About 100 visits |
| 1000 | About 1000 visits |
Pattern observation: The number of steps grows roughly in direct proportion to the number of nodes.
Time Complexity: O(n)
This means the time to do the boundary traversal grows linearly with the number of nodes in the tree.
[X] Wrong: "The boundary traversal only visits the boundary nodes, so it must be faster than visiting all nodes."
[OK] Correct: The code still visits many internal nodes to find leaves and boundaries, so it touches most nodes anyway.
Understanding this traversal helps you practice tree recursion and careful node visits, skills useful in many tree problems.
"What if we changed the tree to be a linked list (all nodes only have one child)? How would the time complexity change?"
Practice
Boundary Traversal of Binary Tree?Solution
Step 1: Understand boundary traversal definition
Boundary traversal prints nodes on the edges of the tree: left boundary, leaves, and right boundary.Step 2: Compare with other traversals
Level order prints all nodes level-wise, leaf traversal prints only leaves, in-order prints nodes in left-root-right order.Final Answer:
To print all nodes on the boundary of the tree in an anti-clockwise direction -> Option AQuick Check:
Boundary traversal = print edges anti-clockwise [OK]
- Confusing boundary traversal with level order traversal
- Thinking it prints only leaf nodes
- Mixing it up with in-order traversal
root?Solution
Step 1: Check parameter type for binary tree node
Binary tree nodes are usually passed as pointers to struct Node in C.Step 2: Check return type for traversal functions
Traversal functions usually return void as they print nodes or store results externally.Final Answer:
void boundaryTraversal(struct Node* root); -> Option AQuick Check:
Pointer parameter + void return = void boundaryTraversal(struct Node* root); [OK]
- Using struct keyword incorrectly
- Passing node by value instead of pointer
- Returning int instead of void
1
/ \
2 3
/ \ \
4 5 6
/ \ / \
7 8 9 10
What is the output of the boundary traversal (anti-clockwise) of this tree?Solution
Step 1: Identify left boundary nodes
Left boundary excluding leaves: 1, 2Step 2: Identify leaf nodes left to right
Leaves: 4, 7, 8, 9, 10Step 3: Identify right boundary nodes bottom-up excluding leaves
Right boundary: 6, 3Step 4: Combine in anti-clockwise order
Boundary traversal: 1, 2, 4, 7, 8, 9, 10, 6, 3Final Answer:
[1, 2, 4, 7, 8, 9, 10, 6, 3] -> Option CQuick Check:
Left boundary + leaves + right boundary = [1, 2, 4, 7, 8, 9, 10, 6, 3] [OK]
- Including leaf nodes twice in boundary
- Wrong order of right boundary nodes
- Missing some leaf nodes
void printLeftBoundary(Node* root) {
if (root == NULL) return;
printf("%d ", root->data);
if (root->left) {
printLeftBoundary(root->left);
} else if (root->right) {
printLeftBoundary(root->right);
}
}
Solution
Step 1: Analyze printing condition in left boundary
Function prints node data before recursive call, so top-down order is correct.Step 2: Check if leaf nodes are excluded
The printf is before the child checks, so leaf nodes are printed before returning.Step 3: Identify error
Leaf nodes should not be printed in left boundary function; they are printed separately in leaf traversal.Final Answer:
It prints leaf nodes which should be excluded in left boundary -> Option BQuick Check:
Left boundary excludes leaves [OK]
- Printing leaf nodes in left or right boundary functions
- Not checking for NULL root
- Printing nodes in wrong order
Solution
Step 1: Understand boundary traversal with single-child nodes
Nodes with one child may appear in left or right boundary or as leaves.Step 2: Avoid duplicates by excluding leaves in boundary traversals
Left and right boundary traversals exclude leaves to avoid duplicates; leaves are printed separately.Step 3: Combine traversals carefully
Traverse left boundary top-down excluding leaves, then leaves left to right, then right boundary bottom-up excluding leaves, skipping duplicates.Final Answer:
Traverse left boundary top-down excluding leaves, then all leaves left to right, then right boundary bottom-up excluding leaves, skipping duplicates -> Option DQuick Check:
Exclude leaves in boundaries, print leaves separately [OK]
- Including leaves in both boundary and leaf traversals causing duplicates
- Ignoring nodes with single child in boundary
- Printing nodes in wrong order
Ready to prove it?
Pass the test and this pattern moves unknown
