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

C++でレベル順走査の結果から二分探索木(BST)を構築する方法

レベル順走査(レベル順序トラバーサル)の結果が与えられたとします。この走査結果をもとに、二分探索木(BST:Binary Search Tree)を構築する必要があります。例えば、走査結果が [7, 4, 12, 3, 6, 8, 1, 5, 10] の場合、構築される木は以下の図のようになります。

C++でレベル順走査の結果から二分探索木(BST)を構築する方法

この問題を解くには、再帰的なアプローチを使用します。レベル順走査の性質上、最初の要素がルートとなり、その後の要素はBSTの条件(左の子は親以下、右の子は親より大きい)に従って順番に挿入されていきます。具体的には、以下の手順で構築を進めます。

  • まず、配列の最初の要素を取り出し、これを木のルートとします。
  • 次に2番目の要素を取り出します。その値がルート以下であれば左の子に、大きければ右の子として配置します。
  • 以降の要素についても同様に、手順2の処理を再帰的に繰り返し適用することで、BST全体を構築します。

アルゴリズムのポイント

各要素を挿入する際には、ルートから出発して値の大小を比較しながら適切な位置まで降りていきます。この操作は木の高さに比例した時間で行えるため、バランスの取れた木であれば平均的に効率的な構築が可能です。

実装例(C++)

#include <iostream>
using namespace std;
class Node {
    public:
    int data;
    Node *left, *right;
};
Node* getNode(int data) {
    Node *newNode = new Node;
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return newNode;
}
Node *lvlOrd(Node *root , int data) {
    if(root==NULL){
        root = getNode(data);
        return root;
    }
    if(data <= root->data)
        root->left = lvlOrd(root->left, data);
    else
        root->right = lvlOrd(root->right, data);
    return root;
}
Node* makeTree(int arr[], int n) {
    if(n==0)
        return NULL;
    Node *root= NULL;
    for(int i=0;i<n;i++)
    root = lvlOrd(root , arr[i]);
    return root;
}
void inord(Node* root) {
    if (!root)
        return;
    inord(root->left);
    cout << root->data << " ";
    inord(root->right);
}
int main() {
    int arr[] = {7, 4, 12, 3, 6, 8, 1, 5, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    Node *root = makeTree(arr, n);
    cout << "Inorder Traversal: ";
    inord(root);
}

このコードの構成は以下の通りです。

  • Node クラス:木の各ノードを表し、データと左右の子ポインタを持ちます。
  • getNode 関数:新しいノードを生成して初期化します。
  • lvlOrd 関数:BSTのルールに従って、指定された値を適切な位置に再帰的に挿入します。
  • makeTree 関数:配列の各要素を順に lvlOrd 関数へ渡し、木全体を構築します。
  • inord 関数:中順走査(Inorder Traversal)を行い、結果が昇順にソートされていれば正しくBSTが構築されたことを確認できます。

出力結果

Inorder Traversal: 1 3 4 5 6 7 8 10 12

出力が昇順に並んでいることから、レベル順走査の配列から正しく二分探索木が構築されたことが確認できます。中順走査はBSTを走査すると必ず昇順の結果を得られるため、構築の正しさを検証するのに便利です。

  1. 【データ構造】二分探索木のレベル順走査(Level-Order Traversal)をC++で実装して理解しよう

    本記事では、二分探索木(Binary Search Tree)におけるレベル順走査(Level-Order Traversal)の手法について詳しく解説します。レベル順走査は、木の根(ルート)から出発し、上の階層から下の階層へ、同じ深さのノードは左から右の順に訪問していく方法です。この走査は幅優先探索(BFS:Breadth-First Search)とも呼ばれ、木やグラフの探索において非常に重要な基本概念となっています。 例として、次のような二分探索木を考えてみましょう。 この木に対してレベル順走査を実行すると、ノードは次の順序で訪問されます。 10 → 5 → 16 → 8 → 15

  2. Pythonのスタックを使って後順走査(ポストオーダー)から二分探索木(BST)を構築する方法

    問題概要 二分探索木(BST)の後順走査(ポストオーダートラバーサル)の結果が1つ与えられたとき、その走査結果から元となる二分探索木を復元する問題を考えます。 例えば、入力が [6, 12, 10, 55, 45, 15] の場合、出力される木構造は次のようになります。 解法のアプローチ この問題を解くために、以下の手順に従います。 関数 solve() を定義します。引数として後順走査のリスト postorder を受け取ります。 n := postorder の要素数とします。 root := 後順走査の最後の要素を値として持つ新しいツリーノードを作成します。 stk := 空のスタッ