JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptにおける木構造の走査(ツリートラバーサル)入門

木構造の走査(ツリートラバーサル)とは

木構造の走査(ツリートラバーサル)とは、ツリー(木)データ構造に含まれる各ノードを、正確に一度ずつ訪問する処理のことを指します。ツリーは階層的なデータ構造であるため、配列のような線形構造とは異なり、どの順序でノードを辿るかが重要な設計要素となります。この走査順序によって、トラバーサルはいくつかの種類に分類されます。

主な走査方法の種類

木構造の走査は、大きく「深さ優先探索(DFS)」と「幅優先探索(BFS)」の2つに分けられます。

深さ優先探索(DFS)

深さ優先探索は、あるノードから出発して子孫方向へできる限り深く進み、行き止まりに達したら戻りながら次の経路を探索する方式です。さらに、ノードを訪問するタイミングによって以下の3種類に分類されます。

  • 先行順(前順・Preorder): 親ノード → 左の子 → 右の子 の順で訪問します。木構造の複製を作成する際などに利用されます。
  • 中間順(中順・Inorder): 左の子 → 親ノード → 右の子 の順で訪問します。二分探索木において、昇順にソートされたデータを取得できます。
  • 後行順(Postorder): 左の子 → 右の子 → 親ノード の順で訪問します。子ノードを先に処理してから親を削除したい場合などに適しています。

幅優先探索(BFS)

幅優先探索(レベル順走査とも呼ばれます)は、根(ルート)に近いノードから順に、同じ深さのノードを横方向へ訪問していく方式です。通常はキュー(Queue)というデータ構造を使用して実装されます。木の高さや最短距離を求めたい場合に有効です。

まとめ

JavaScriptで木構造を扱う際には、目的に応じて適切な走査方法を選択することが重要です。再帰関数を使えば深さ優先探索を簡潔に実装でき、キューを使えば幅優先探索を実装できます。それぞれの特徴を理解し、用途に合わせて使い分けましょう。

  1. JavaScriptでフラットなオブジェクト配列をツリー構造に変換する方法

    はじめにWeb開発では、カテゴリ一覧やフォルダ構成、組織図など、階層構造をもつデータを画面に表示したい場面がよくあります。一方で、データベースやAPIから取得したデータは、idとparentIdを持つフラット(一次元)な配列として渡されることがほとんどです。本記事では、こうしたフラットな配列をもとに、子要素を親オブジェクトへリンクさせたツリー構造を組み立て、ネストされたリスト形式で画面に表示するまでの手順を、HTML・CSSのコード付きでわかりやすく解説します。元データとなるフラットな配列まず、変換対象となるデータを確認しましょう。各オブジェクトは、自身の一意な識別子であるid、表示名のnam

  2. 【C++】二分木のジグザグ走査(ZigZag Traversal)を2つのスタックで実装する方法

    この問題では、二分木(binary tree)が与えられ、その全ノードをジグザグ状(ZigZag)に出力することが求められます。 まず、具体例を使って問題を確認しましょう。 上記の二分木をジグザグ走査すると、各ノードは次の順序で出力されます。 3 5 1 8 7 0 4 1層目は左から右、2層目は右から左…というように、レベルが変わるごとに走査の向きが交互に反転するのがジグザグ走査の特徴です。 解法の考え方 この問題を解くには、二分木をレベル順(幅優先)で走査し、各レベルが終わるたびに走査の向きを反転させます。 ここでは、「現在のレベル用(c