Bird
Raised Fist0
DSA Javascriptprogramming

Heap Concept Structure and Properties in DSA Javascript

Choose your learning style10 modes available
Mental Model
A heap is a special tree where each parent is bigger (or smaller) than its children, making it easy to find the biggest or smallest item quickly.
Analogy: Imagine a family tree where every parent is taller than their children, so the tallest person is always at the top, making it easy to find the tallest family member.
       10
      /  \
     7    9
    / \  / \
   5  6 8  4
Dry Run Walkthrough
Input: Build a max-heap from array [5, 9, 8, 4, 7, 6, 10]
Goal: Rearrange the array into a max-heap where each parent is greater than its children
Step 1: Start from the last parent node at index 2 (value 8), compare with children and swap with largest child if needed
[5, 9, 10, 4, 7, 6, 8]
Why: We fix the subtree rooted at index 2 to satisfy max-heap property
Step 2: Move to parent node at index 1 (value 9), compare with children and swap if needed
[5, 9, 10, 4, 7, 6, 8]
Why: No swap needed because 9 is greater than children 4 and 7
Step 3: Move to root node at index 0 (value 5), compare with children and swap with largest child (10)
[10, 9, 5, 4, 7, 6, 8]
Why: Root must be largest, so swap with largest child 10
Step 4: Fix subtree rooted at index 2 (value 5), swap with largest child (8)
[10, 9, 8, 4, 7, 6, 5]
Why: After root swap, fix subtree to maintain max-heap
Result:
[10, 9, 8, 4, 7, 6, 5] -- max-heap formed
Annotated Code
DSA Javascript
class MaxHeap {
  constructor() {
    this.heap = [];
  }

  // Swap two elements in the heap array
  swap(i, j) {
    [this.heap[i], this.heap[j]] = [this.heap[j], this.heap[i]];
  }

  // Heapify subtree rooted at index i
  heapify(i) {
    const left = 2 * i + 1;
    const right = 2 * i + 2;
    let largest = i;

    // Check if left child is larger
    if (left < this.heap.length && this.heap[left] > this.heap[largest]) {
      largest = left;
    }

    // Check if right child is larger
    if (right < this.heap.length && this.heap[right] > this.heap[largest]) {
      largest = right;
    }

    // If largest is not root, swap and continue heapifying
    if (largest !== i) {
      this.swap(i, largest);
      this.heapify(largest);
    }
  }

  // Build max heap from array
  buildHeap(arr) {
    this.heap = arr.slice();
    const start = Math.floor(this.heap.length / 2) - 1;

    // Heapify from last parent to root
    for (let i = start; i >= 0; i--) {
      this.heapify(i);
    }
  }

  // Print heap as array
  printHeap() {
    console.log(this.heap);
  }
}

// Driver code
const arr = [5, 9, 8, 4, 7, 6, 10];
const maxHeap = new MaxHeap();
maxHeap.buildHeap(arr);
maxHeap.printHeap();
if (left < this.heap.length && this.heap[left] > this.heap[largest]) {
Check if left child is bigger than current largest
if (right < this.heap.length && this.heap[right] > this.heap[largest]) {
Check if right child is bigger than current largest
if (largest !== i) { this.swap(i, largest); this.heapify(largest); }
Swap with largest child and heapify subtree to maintain max-heap
for (let i = start; i >= 0; i--) { this.heapify(i); }
Build heap by heapifying all parent nodes from bottom up
OutputSuccess
[10, 9, 8, 4, 7, 6, 5]
Complexity Analysis
Time: O(n) because heapify is called on all parent nodes and each heapify takes O(log n) but overall buildHeap is O(n)
Space: O(n) because we store the heap array of size n
vs Alternative: Building a heap by inserting elements one by one is O(n log n), so this bottom-up heapify is more efficient
Edge Cases
Empty array
Heap remains empty without errors
DSA Javascript
const start = Math.floor(this.heap.length / 2) - 1;
Single element array
Heap is the same single element
DSA Javascript
for (let i = start; i >= 0; i--) { this.heapify(i); }
All elements equal
Heap remains unchanged as all parents equal children
DSA Javascript
if (this.heap[left] > this.heap[largest])
When to Use This Pattern
When you need quick access to the largest or smallest item and want to maintain order efficiently, use a heap because it keeps the biggest or smallest at the top.
Common Mistakes
Mistake: Starting heapify from index 0 instead of last parent node
Fix: Start heapify from Math.floor(n/2) - 1 to cover all parents
Mistake: Not recursively heapifying after swap
Fix: Call heapify again on the swapped child's index to fix subtree
Summary
A heap is a tree where parents are always bigger (max-heap) or smaller (min-heap) than their children.
Use a heap when you want fast access to the largest or smallest element in a collection.
The key is to fix the tree from bottom up so each parent is bigger than its children, making the top the biggest.

Practice

(1/5)
1. What is a key property of a max heap data structure?
easy
A. Every parent node is greater than or equal to its child nodes
B. Every parent node is less than or equal to its child nodes
C. All leaf nodes are greater than the root node
D. The tree is always a complete binary tree but unordered

Solution

  1. Step 1: Understand max heap property

    A max heap requires that each parent node is greater than or equal to its children.
  2. Step 2: Compare options with max heap definition

    Every parent node is greater than or equal to its child nodes matches the max heap property exactly, others describe min heap or incorrect properties.
  3. Final Answer:

    Every parent node is greater than or equal to its child nodes -> Option A
  4. Quick Check:

    Max heap = parent ≥ children [OK]
Hint: Max heap means parent is always bigger or equal [OK]
Common Mistakes:
  • Confusing max heap with min heap property
  • Thinking leaf nodes must be bigger than root
  • Ignoring the complete binary tree requirement
2. Which of the following is the correct way to represent a heap in JavaScript using an array?
easy
A. Parent at index i, left child at i + 1, right child at i + 2
B. Parent at index i, left child at 2*i + 1, right child at 2*i + 2
C. Parent at index i, left child at 2*i, right child at 2*i + 1
D. Parent at index i, left child at i - 1, right child at i - 2

Solution

  1. Step 1: Recall array indexing for heap

    In zero-based arrays, left child index = 2*i + 1, right child index = 2*i + 2.
  2. Step 2: Match options with formula

    Parent at index i, left child at 2*i + 1, right child at 2*i + 2 matches the correct formula for zero-based indexing heaps.
  3. Final Answer:

    Parent at index i, left child at 2*i + 1, right child at 2*i + 2 -> Option B
  4. Quick Check:

    Heap array indexing = 2*i+1, 2*i+2 [OK]
Hint: Remember zero-based indexing: left=2i+1, right=2i+2 [OK]
Common Mistakes:
  • Using one-based indexing formulas incorrectly
  • Swapping left and right child indices
  • Using i+1 or i+2 which is wrong for heap
3. Consider the following JavaScript code that builds a max heap from an array:
const arr = [3, 9, 2, 1, 4, 5];
function maxHeapify(arr, i, n) {
  let largest = i;
  let left = 2 * i + 1;
  let right = 2 * i + 2;
  if (left < n && arr[left] > arr[largest]) largest = left;
  if (right < n && arr[right] > arr[largest]) largest = right;
  if (largest !== i) {
    [arr[i], arr[largest]] = [arr[largest], arr[i]];
    maxHeapify(arr, largest, n);
  }
}

function buildMaxHeap(arr) {
  let n = arr.length;
  for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
    maxHeapify(arr, i, n);
  }
}

buildMaxHeap(arr);
console.log(arr);
What is the output printed?
medium
A. [3, 9, 2, 1, 4, 5]
B. [9, 3, 5, 1, 4, 2]
C. [5, 4, 3, 1, 9, 2]
D. [9, 4, 5, 1, 3, 2]

Solution

  1. Step 1: Understand buildMaxHeap process

    Start heapifying from last non-leaf node at index 2 (value 2), then index 1 (value 9), then index 0 (value 3).
  2. Step 2: Trace heapify calls

    Initial: [3,9,2,1,4,5]
    Heapify i=2: left=5 (5>2), largest=5, swap 2-5: [3,9,5,1,4,2]. Heapify 5: no children.
    Heapify i=1: left=3(1<9), right=4(4<9), no swap.
    Heapify i=0: left=1(9>3), largest=1; right=2(5<9), swap 0-1: [9,3,5,1,4,2]. Heapify 1 (val=3): left=3(1<3), right=4(4>3), largest=4, swap 1-4: [9,4,5,1,3,2]. Heapify 4: no children.
  3. Final Answer:

    [9, 4, 5, 1, 3, 2] -> Option D
  4. Quick Check:

    Max heap array after build = [9,4,5,1,3,2] [OK]
Hint: Heapify from bottom non-leaf nodes up [OK]
Common Mistakes:
  • Not heapifying recursively after swap
  • Confusing indices for children
  • Assuming original array order remains
4. The following JavaScript function is intended to insert a new value into a max heap represented as an array. Identify the bug:
function insertHeap(arr, value) {
  arr.push(value);
  let i = arr.length - 1;
  while (i > 0) {
    let parent = Math.floor(i / 2);
    if (arr[parent] < arr[i]) {
      [arr[parent], arr[i]] = [arr[i], arr[parent]];
      i = parent;
    } else {
      break;
    }
  }
}
medium
A. Parent index calculation should be Math.floor((i - 1) / 2)
B. The loop should run while i >= 0
C. The swap should happen only if arr[parent] > arr[i]
D. The function should remove the last element before inserting

Solution

  1. Step 1: Check parent index formula in zero-based heap

    In zero-based arrays, parent index = Math.floor((i - 1) / 2), not Math.floor(i / 2).
  2. Step 2: Understand impact of wrong parent index

    Using Math.floor(i / 2) causes incorrect parent calculation, breaking heap property restoration.
  3. Final Answer:

    Parent index calculation should be Math.floor((i - 1) / 2) -> Option A
  4. Quick Check:

    Parent index = (i-1)//2 in zero-based heap [OK]
Hint: Parent index in zero-based heap = (i-1)//2 [OK]
Common Mistakes:
  • Using i/2 instead of (i-1)/2 for parent
  • Loop condition allowing i=0 to cause errors
  • Swapping when parent is larger, not smaller
5. You have a min heap represented as an array: [2, 5, 8, 10, 15, 20]. You want to insert the value 1 and maintain the min heap property. Which sequence of array states correctly shows the heap after each step of insertion and heapify up?
hard
A. [2, 5, 8, 10, 15, 20, 1] -> [2, 5, 8, 10, 15, 20, 1] -> [1, 5, 8, 10, 15, 20, 2]
B. [2, 5, 8, 10, 15, 20, 1] -> [1, 5, 8, 10, 15, 20, 2]
C. [2, 5, 8, 10, 15, 20, 1] -> [2, 5, 1, 10, 15, 20, 8] -> [1, 5, 2, 10, 15, 20, 8]
D. [2, 5, 8, 10, 15, 20, 1] -> [1, 2, 5, 10, 15, 20, 8]

Solution

  1. Step 1: Insert value at end

    Insert 1 at the end: [2, 5, 8, 10, 15, 20, 1]
  2. Step 2: Heapify up swaps

    Compare 1 with parent at index 2 (value 8), swap: [2, 5, 1, 10, 15, 20, 8]
    Compare 1 with new parent at index 0 (value 2), swap: [1, 5, 2, 10, 15, 20, 8]
  3. Step 3: Final heap state

    Heap property restored with 1 at root.
  4. Final Answer:

    [2, 5, 8, 10, 15, 20, 1] -> [2, 5, 1, 10, 15, 20, 8] -> [1, 5, 2, 10, 15, 20, 8] -> Option C
  5. Quick Check:

    Heapify up swaps child with parent until order restored [OK]
Hint: Heapify up swaps child with parent until order restored [OK]
Common Mistakes:
  • Not swapping with correct parent index
  • Stopping heapify too early
  • Incorrect final heap array after swaps
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard