Here's a simple algorithm that walks the DOM given a node:

    function walkDOM(n) {
        do {
            console.log(n);
            if (n.hasChildNodes()) {
                walkDOM(n.firstChild)
            }
        } while (n = n.nextSibling)
    }

I wanted to implement it iteratively as an exercise, and came up with this:

    function walkDOM2(n) {
        var recStack = [];
        // First get the parent of the given node, so that
        // you can get the siblings of the given node too
        // (starting from the last sibling),
        // rather than just start with the children of the
        // given node.
        // (This is to make this behave the
        // same way as the recursive one.)
        recStack.push(n.parentNode);
    
        while (recStack.length > 0) {
            var current = recStack.pop();
            // Log only if the current node is
            // the given node or a node below it.
            // (This is to make this behave the
            // same way as the recursive one.)
            if (current != n.parentNode)
                console.log(current);
            if (!current.hasChildNodes())
                continue;
    
            current = current.lastChild;
            do {
                recStack.push(current);
                // Skip the sibling nodes
                // before the given node.
                // (This is to make this behave the
                // same way as the recursive one.)
                if (current === n)
                    break;
            } while (current = current && current.previousSibling);
        }
    }

I have used a couple tricks to make it behave the same way as the first recursive version. Is there a more concise way of writing this without recursion?