この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
58. DOM treeの高さを返す

再起を使って解く場合:

function getDomTreeHeight(node) {
  if (!node || !node.childNodes) { // nodeがnullか、childNodesがない場合(ノードがテキストノードなど)
    return 0;
  } else {
    let maxChildHeight = 0;
    for (let child of node.childNodes) {
      if (child.nodeType === Node.ELEMENT_NODE) { // ELEMENT_NODEの場合のみ再帰的に子ノードを探索
        let childHeight = getDomTreeHeight(child);
        if (childHeight > maxChildHeight) {
          maxChildHeight = childHeight;
        }
      }
    }
    return maxChildHeight + 1; // 子ノードの高さの最大値 + 1(自分自身の高さ)
  }
}

再起を使わない場合:

function getDomTreeHeight(node) {
  let height = 0;
  let stack = [{node: node, depth: 1}];
  
  while (stack.length > 0) {
    let current = stack.pop();
    let currentNode = current.node;
    let currentDepth = current.depth;
    if (currentNode.nodeType === Node.ELEMENT_NODE) {
      height = Math.max(height, currentDepth);
      for (let child of currentNode.childNodes) {
        stack.push({node: child, depth: currentDepth + 1});
      }
    }
  }
  
  return height;
}

どちらの解法でも、与えられたnodeがnullまたはテキストノードなどの場合は高さ0を返します。再起を使う場合は、childNodesがない場合も同様に高さ0を返します。それ以外の場合は、子ノードの高さの最大値に+1した値を返します。スタックを使う場合は、配列の最後尾から取り出したノードをチェックします。ノードがELEMENT_NODEである場合は、その高さを更新し、子ノードをスタックに追加します。スタックが空になるまでこの処理を繰り返すことで、DOM treeの高さを求めます。