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)であり、すべてのノードを一度ずつ訪問するだけで効率的に深さを求められます。チュートリアルの内容についてご不明な点がありましたら、コメント欄でお気軽にお尋ねください。
-
Pythonでn分木(N-ary Tree)のルートノードを見つけるプログラム
n分木(N-ary Tree)の各ノードが配列として与えられているとします。ここで求めたいのは、木を再構築したうえでルートノードを見つけて返すことです。返されたノードを起点に、木全体を先行順(Preorder)で表示できれば成功です。 たとえば、入力が次のような場合を考えてみましょう。 このときの出力は以下のようになります。 [14, 27, 32, 42, 56, 65] この出力は、見つけたルートノードから木の先行順走査(Preorder Traversal)を行った結果です。つまり、正しいルートさえ特定できれば、そこから木全体の構造を復元できます。 解決のアプローチ:入次数(In-d
-
Pythonでn分木(n-aryツリー)のコピーを作成する方法を解説
n分木のコピーとは本記事では、ルートノード「root」が与えられたn分木(n-aryツリー)の完全なコピーを作成し、元の木とコピーした木の両方に対して先行順走査(preorder traversal)を実行する方法を解説します。作成したコピーは、別の新しいルートノードに格納する必要があります。使用するノードの構造は以下のとおりです。Node: value : <整数> children : <配列>入力例と出力例たとえば、次のようなn分木が与えられた場合を考えてみましょう。この場合、出力は次のようになります。[14, 27, 32, 42, 56, 65