Traverse DOM tree

You are required to implement a function that traverses the DOM tree and returns an array of all the elements in the tree.

Constraints

  • The input root is guaranteed to be a valid DOM element.
  • The tree can have any number of nested elements.

Example Input

<div id="root">
    <div id="child1">
        <span id="child1_1"></span>
    </div>
    <div id="child2">
        <span id="child2_1"></span>
        <span id="child2_2"></span>
    </div>
</div>

<script>
    const rootElement = document.getElementById('root');
    console.log(getAllElements(rootElement));
</script>

Output

[
    <div id="root">...</div>,
    <div id="child1">...</div>,
    <span id="child1_1"></span>,
    <div id="child2">...</div>,
    <span id="child2_1"></span>,
    <span id="child2_2"></span>
]

Solution 1: DFS

To solve this problem, we can use a recursive depth-first traversal approach. The function getAllElements will start from the given root element and traverse each child node, collecting them in an array.

function getAllElements(root) {
    const result = [];

    function dfs(node) {
        result.push(node);
        for (let i = 0; i < node.childNodes.length; i++) {
            const child = node.childNodes[i];
            if (child.nodeType === 1) { // Only consider element nodes
                dfs(child);
            }
        }
    }

    // Start traversal from the root element
    dfs(root);

    return result;
}

// Example usage:
// Assuming the DOM structure from Example 1
document.addEventListener('DOMContentLoaded', () => {
  const rootElement = document.getElementById('root');
  console.log(getAllElements(rootElement));
});

Complexity

  • Time complexity: O(N)
  • Space complexity: O(N)

Solution 2: BFS

function getAllElements(root) {
  const result = [];
  if (!root) return result;
  
  const queue = [root];
  
  while (queue.length) {
    const node = queue.shift();
    result.push(node);
    for (const child of node.children) {
      queue.push(child);
    }
  }
  
  return result;
}

// Example usage:
// Assuming the DOM structure from Example 1
document.addEventListener('DOMContentLoaded', () => {
  const rootElement = document.getElementById('root');
  console.log(getAllElements(rootElement));
});

Complexity

  • Time complexity: O(N)
  • Space complexity: O(N)