Why Trees Exist and What Linked Lists and Arrays Cannot Do in DSA Typescript - Performance Analysis
We want to understand why trees are used instead of just arrays or linked lists.
What makes trees faster or better for some tasks?
Analyze the time complexity of searching for a value in different data structures.
// Search in an array
function searchArray(arr: number[], target: number): boolean {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) return true;
}
return false;
}
// Search in a binary search tree (BST)
function searchBST(node: TreeNode | null, target: number): boolean {
if (!node) return false;
if (node.val === target) return true;
if (target < node.val) return searchBST(node.left, target);
else return searchBST(node.right, target);
}
This code shows searching for a value in an array and in a binary search tree.
Look at what repeats when searching:
- Primary operation: Checking each element in the array or moving down one node in the tree.
- How many times: In array, up to n times (all elements). In tree, up to height h times (nodes from root to leaf).
As the number of items grows, how does searching change?
| Input Size (n) | Array Search Steps | BST Search Steps (height h) |
|---|---|---|
| 10 | Up to 10 checks | About 4 steps (log2(10)) |
| 100 | Up to 100 checks | About 7 steps (log2(100)) |
| 1000 | Up to 1000 checks | About 10 steps (log2(1000)) |
Pattern observation: Array search grows directly with n, but tree search grows much slower, roughly with the height (log n).
Time Complexity: O(n) for array search, O(log n) for balanced BST search
This means searching in an array takes longer as the list grows, but searching in a balanced tree stays fast even with many items.
[X] Wrong: "Trees always search faster than arrays no matter what."
[OK] Correct: If the tree is not balanced, its height can be as big as n, making search as slow as array search.
Understanding why trees exist helps you explain choices in data structures clearly and shows you know how to pick the right tool for the job.
"What if the binary search tree is unbalanced and looks like a linked list? How would the time complexity change?"
Practice
Solution
Step 1: Understand the limitation of arrays and linked lists
Arrays and linked lists store data in a linear sequence, which makes it hard to represent hierarchical or branching relationships.Step 2: Identify the unique feature of trees
Trees allow each element to have multiple children, representing hierarchical data like file systems or organization charts.Final Answer:
Trees represent hierarchical relationships which arrays and linked lists cannot -> Option DQuick Check:
Hierarchical data needs trees = C [OK]
- Thinking trees always use less memory
- Believing trees are simpler to implement
- Assuming trees always have faster access
Solution
Step 1: Identify tree node properties
A tree node stores a value and multiple children nodes, so it needs a children array.Step 2: Match with the correct class declaration
class TreeNode { value: number; children: TreeNode[]; constructor(value: number) { this.value = value; this.children = []; } } declares a value and children array, suitable for a tree node. Declarations using next or prev are for linked lists. class TreeNode { value: number; array: number[]; constructor(value: number) { this.value = value; this.array = []; } } uses an array of numbers, not nodes.Final Answer:
correctly declares a tree node with children array -> Option AQuick Check:
Tree nodes have children array = A [OK]
- Confusing tree nodes with linked list nodes
- Using next or prev instead of children array
- Using array of numbers instead of nodes
class TreeNode {
value: number;
children: TreeNode[];
constructor(value: number) {
this.value = value;
this.children = [];
}
}
const root = new TreeNode(1);
const child1 = new TreeNode(2);
const child2 = new TreeNode(3);
root.children.push(child1);
root.children.push(child2);
console.log(root.children.length);Solution
Step 1: Understand the tree construction
A root node with value 1 is created. Two child nodes with values 2 and 3 are created and added to root's children array.Step 2: Count the children of root
Two children are pushed into root.children, so root.children.length is 2.Final Answer:
2 -> Option CQuick Check:
Two children added = 2 [OK]
- Assuming children length is 0 by default
- Confusing children with linked list next pointers
- Counting nodes instead of children array length
class TreeNode {
value: number;
children: TreeNode[];
constructor(value: number) {
this.value = value;
this.children = null;
}
}
const root = new TreeNode(10);
root.children.push(new TreeNode(20));Solution
Step 1: Check children initialization
children is set to null, so calling push on null causes an error.Step 2: Correct children initialization
children should be initialized as an empty array [] to allow push method calls.Final Answer:
children should be initialized as an empty array, not null -> Option BQuick Check:
push on null causes error = A [OK]
- Setting children to null instead of []
- Trying to push on null causing runtime error
- Ignoring constructor parameters
Choose the best answer.
Solution
Step 1: Understand the problem context
An organizational chart is hierarchical: managers have multiple subordinates, forming branches.Step 2: Match data structure to hierarchy
Trees allow nodes to have multiple children, perfectly modeling this hierarchy. Arrays and linked lists are linear, stacks are LIFO structures unsuitable here.Final Answer:
Use a tree because it naturally models hierarchical relationships -> Option AQuick Check:
Hierarchy needs trees = D [OK]
- Choosing arrays or linked lists for hierarchical data
- Confusing stack behavior with organizational needs
- Ignoring multiple children per node requirement
Ready to prove it?
Pass the test and this pattern moves unknown
