Вот рекурсивная реализация, которая проверяет каждый «родительский» элемент, чтобы увидеть, имеет ли он более 0
дочерних элементов. Если это так, прокрутите дочерние элементы, вызовите функцию и установите «нового» родителя.
function recursiveTagLister(parent = document.body, depth = 0){
const indentation = (new Array(depth)).fill(' ').join("");
console.log(indentation + parent.tagName);
if(parent.children.length > 0){
Array
.from(parent.children)
.forEach(item=>recursiveTagLister(item, depth+1));
}
}
recursiveTagLister();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>Header</h1>
<p>Some text
<a href="#">References</a>
</p>
<ul id="myList">
<li>One</li>
<li>Two</li>
<li>Tree</li>
</ul>
</body>
</html>