Create a Binary Tree Manually in DSA C - Time & Space Complexity
When we create a binary tree manually, we add nodes one by one. Understanding how the time to build the tree grows helps us plan for bigger trees.
We want to know: How does the time to create the tree change as we add more nodes?
Analyze the time complexity of the following code snippet.
// Create nodes manually and link them
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
struct Node* root = malloc(sizeof(struct Node));
root->data = 1;
root->left = malloc(sizeof(struct Node));
root->left->data = 2;
root->right = malloc(sizeof(struct Node));
root->right->data = 3;
root->left->left = NULL;
root->left->right = NULL;
root->right->left = NULL;
root->right->right = NULL;
This code creates a binary tree with three nodes manually by allocating memory and linking nodes.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Allocating and linking each node manually.
- How many times: Once per node created (3 times here).
Each new node requires a fixed amount of work: allocate memory and set pointers.
| Input Size (n) | Approx. Operations |
|---|---|
| 3 | 3 allocations and links |
| 10 | 10 allocations and links |
| 100 | 100 allocations and links |
Pattern observation: The work grows directly with the number of nodes added.
Time Complexity: O(n)
This means the time to create the tree grows linearly with the number of nodes.
[X] Wrong: "Creating a binary tree manually is constant time because we just write code once."
[OK] Correct: Each node requires separate work to allocate and link, so time grows with the number of nodes.
Understanding how manual tree creation scales helps you reason about building data structures efficiently in real projects and interviews.
"What if we used a loop to create and link nodes instead of writing each allocation manually? How would the time complexity change?"
Practice
Solution
Step 1: Understand binary tree node structure
A binary tree node in C is usually a struct with data and two pointers (left and right) to child nodes.Step 2: Initialize node with value and NULL children
To create a node with value 10, set data = 10 and left, right pointers to NULL to indicate no children yet.Final Answer:
Create a struct node with data = 10 and left, right pointers set to NULL -> Option AQuick Check:
Binary tree node = struct with data + NULL children [OK]
- Using an integer variable instead of a struct node
- Not initializing left and right pointers to NULL
- Using arrays to represent nodes directly
- Declaring pointers without allocation or initialization
Solution
Step 1: Use malloc to allocate memory for a struct pointer
In C, dynamic memory allocation for a struct pointer uses malloc with sizeof the struct type.Step 2: Correct pointer declaration and malloc usage
struct node *newNode = malloc(sizeof(struct node)); correctly declares a pointer and assigns malloc result cast implicitly to void*.Final Answer:
struct node *newNode = malloc(sizeof(struct node)); -> Option DQuick Check:
Dynamic node creation = pointer + malloc(sizeof(struct node)) [OK]
- Declaring struct variable instead of pointer for malloc
- Using C++ style new operator in C
- Missing struct keyword in declaration
- Incorrect type name without struct keyword
struct node {
int data;
struct node *left, *right;
};
struct node *root = malloc(sizeof(struct node));
root->data = 1;
root->left = malloc(sizeof(struct node));
root->left->data = 2;
root->right = NULL;
printf("%d", root->left->data);Solution
Step 1: Trace node assignments
root->left is allocated and its data is set to 2.Step 2: Print root->left->data value
Printing root->left->data outputs 2 as assigned.Final Answer:
2 -> Option CQuick Check:
root->left->data = 2 [OK]
- Confusing root->data with root->left->data
- Assuming uninitialized pointers have zero
- Expecting segmentation fault without null check
- Misreading pointer dereference
struct node {
int data;
struct node *left, *right;
};
struct node *root;
root->data = 5;
root->left = NULL;
root->right = NULL;Solution
Step 1: Check pointer initialization
root is declared as a pointer but not assigned memory with malloc or set to a valid node.Step 2: Using root->data without allocation causes error
Accessing root->data without initialization leads to undefined behavior or crash.Final Answer:
root is not initialized with memory before use -> Option BQuick Check:
Pointer must be allocated before dereferencing [OK]
- Forgetting to allocate memory with malloc
- Assuming pointer is auto-initialized
- Confusing syntax errors with runtime errors
- Misunderstanding pointer vs variable types
10 / \ 5 15 / / \ 3 12 20Which sequence of C statements correctly creates this tree?
Solution
Step 1: Map tree structure to pointers
Root is 10, left child 5, right child 15. Left child of 5 is 3. Left and right children of 15 are 12 and 20 respectively.Step 2: Verify pointer assignments match tree
Create root with 10, root->left with 5, root->right with 15, then root->left->left with 3, root->right->left with 12, root->right->right with 20 correctly assigns left and right pointers to match the tree shape and values.Final Answer:
Create root with 10, root->left with 5, root->right with 15, then root->left->left with 3, root->right->left with 12, root->right->right with 20 -> Option AQuick Check:
Pointer assignments match tree structure [OK]
- Swapping left and right children
- Assigning nodes to wrong child pointers
- Missing some child node assignments
- Confusing node values with pointer positions
Ready to prove it?
Pass the test and this pattern moves unknown
