C++のn-aryツリーの次の大きな要素
n-aryツリーは、ノードごとにn個の子を持つツリーです。番号nが与えられ、n-aryツリーから次に大きい要素を見つける必要があります。
n-aryツリーをトラバースし、結果を維持することで解決策を見つけることができます。
アルゴリズム
- n-aryツリーを作成します。
- 結果を初期化します。
- 次に大きな要素を取得する関数を記述します。
- 現在のノードがnullの場合に戻ります。
- 現在のノードデータが予想される要素よりも大きいかどうかを確認してください。
- 「はい」の場合、結果が空であるか、結果が現在のノードデータよりも大きいかどうかを確認します。
- 上記の条件が満たされている場合は、結果を更新します。
- 現在のノードの子を取得します。
- 子供たちを繰り返します。
- 再帰関数を呼び出します。
指定された数より大きく、結果よりも小さい要素が見つかるたびに、結果を更新しています。これにより、最終的に次に大きな要素を確実に取得できます。
実装
以下は、C++での上記のアルゴリズムの実装です
#include <bits/stdc++.h> using namespace std; struct Node { int data; vector<Node*> child; }; Node* newNode(int data) { Node* newNode = new Node; newNode->data = data; return newNode; } void findNextGreaterElement(Node* root, int x, Node** result) { if (root == NULL) { return; } if (root->data > x) { if (!(*result) || (*result)->data > root->data) { *result = root; } } int childCount = root->child.size(); for (int i = 0; i < childCount; i++) { findNextGreaterElement(root->child[i], x, result); } return; } int main() { Node* root = newNode(10); root->child.push_back(newNode(12)); root->child.push_back(newNode(23)); root->child.push_back(newNode(45)); root->child[0]->child.push_back(newNode(40)); root->child[1]->child.push_back(newNode(33)); root->child[2]->child.push_back(newNode(12)); Node* result = NULL; findNextGreaterElement(root, 20, &result); cout << result->data << endl; return 0; }
出力
上記のコードを実行すると、次の結果が得られます。
23
-
C++の二分探索木イテレータ
二分木用に1つのイテレータを作成するとします。 2つの方法があります。 next()メソッドは次の要素を返し、hasNext()メソッドはブール値を返します。これは次の要素が存在するかどうかを示します。したがって、ツリーが次のような場合- そして、関数呼び出しのシーケンスは、[next()、next()、hasNext()、next()、hasNext()、next()、hasNext()、next()、hasNext()]です。出力は[3,7、true、9、true、15、true、20、false]になります これを解決するには、次の手順に従います- nextとhasNextの
-
C++での再帰なしのN-aryツリーのプレオーダートラバーサル
この問題では、N-aryツリーが与えられます。私たちのタスクは、ツリーのプレオーダートラバーサルを印刷することです。 まず、いくつかの基本的な用語を学びましょう。 N-aryツリー は、すべてのノードが最大N個の子ノードを持つことができるツリーです。例2-ary(バイナリ)ツリーには最大2つの子ノードがあります。 プレオーダートラバーサル ツリーのノードをトラバースする方法です。ここでは、最初にルートノードをトラバースし、次に左の子、次に右の子をトラバースします。 私たちの問題を理解するために例を見てみましょう Preorder traversal : 1215149941171