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

C++でN分木(N-Aryツリー)の深さを求める方法

このチュートリアルでは、N分木(N-Aryツリー)の深さを求める方法について解説します。

N分木とは、木を構成する各ノードが持つことのできる子ノードの数がn個以下に制限された木構造のことです。本記事では、このN分木の深さ(根ノードから最も深い葉ノードまでの階層数)を求めるプログラムをC++で実装します。各ノードの子ノードは、vectorを使って格納します。

アルゴリズムの手順

  • ダミーデータを使って木を初期化します。

  • N分木の深さを求める再帰関数を作成します。

    • 木の最大深度を保持する変数を0で初期化します。

    • 各ノードの子ノードを順番に走査します。

      • 現在の最大深度と、その子ノードを根とする部分木の深度を比較し、大きい方を新しい最大深度として更新します。

      • 最大深度を格納する変数をmaxDepthとすると、maxDepth = max(maxDepth, findDepthOfTree(*child))という再帰呼び出しによって木全体の深さが求まります。

    • 最終的な木の深さはmaxDepth + 1となります(現在のノード自身の階層分を加算)。

  • 求めた木の最大深度を出力します。

サンプルコード

それでは、実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
struct Node {
    int data;
    vector<Node *> child;
};
Node *newNode(int data) {
    Node *temp = new Node;
    temp->data = data;
    return temp;
}
int findDepthOfTree(struct Node *node) {
    if (node == NULL) {
        return 0;
    }
    int maxDepth = 0;
    for (vector<Node*>::iterator it = node->child.begin(); it != node->child.end(); it++) {
        maxDepth = max(maxDepth, findDepthOfTree(*it));
    }
    return maxDepth + 1;
}
int main() {
    Node *root = newNode(1);
    root->child.push_back(newNode(2));
    root->child.push_back(newNode(3));
    root->child.push_back(newNode(4));
    root->child[2]->child.push_back(newNode(1));
    root->child[2]->child.push_back(newNode(2));
    root->child[2]->child.push_back(newNode(3));
    root->child[2]->child.push_back(newNode(4));
    cout << findDepthOfTree(root) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、次のような結果が出力されます。

3

まとめ

このチュートリアルでは、vectorを使ってN分木を表現し、再帰関数によって深さを求める方法を紹介しました。このアルゴリズムの計算量は、ノード数をNとするとO(N)であり、すべてのノードを一度ずつ訪問するだけで効率的に深さを求められます。チュートリアルの内容についてご不明な点がありましたら、コメント欄でお気軽にお尋ねください。

  1. Pythonでn分木(N-ary Tree)のルートノードを見つけるプログラム

    n分木(N-ary Tree)の各ノードが配列として与えられているとします。ここで求めたいのは、木を再構築したうえでルートノードを見つけて返すことです。返されたノードを起点に、木全体を先行順(Preorder)で表示できれば成功です。 たとえば、入力が次のような場合を考えてみましょう。 このときの出力は以下のようになります。 [14, 27, 32, 42, 56, 65] この出力は、見つけたルートノードから木の先行順走査(Preorder Traversal)を行った結果です。つまり、正しいルートさえ特定できれば、そこから木全体の構造を復元できます。 解決のアプローチ:入次数(In-d

  2. Pythonでn分木(n-aryツリー)のコピーを作成する方法を解説

    n分木のコピーとは本記事では、ルートノード「root」が与えられたn分木(n-aryツリー)の完全なコピーを作成し、元の木とコピーした木の両方に対して先行順走査(preorder traversal)を実行する方法を解説します。作成したコピーは、別の新しいルートノードに格納する必要があります。使用するノードの構造は以下のとおりです。Node: value : <整数> children : <配列>入力例と出力例たとえば、次のようなn分木が与えられた場合を考えてみましょう。この場合、出力は次のようになります。[14, 27, 32, 42, 56, 65