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

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

  1. 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の

  2. C++での再帰なしのN-aryツリーのプレオーダートラバーサル

    この問題では、N-aryツリーが与えられます。私たちのタスクは、ツリーのプレオーダートラバーサルを印刷することです。 まず、いくつかの基本的な用語を学びましょう。 N-aryツリー は、すべてのノードが最大N個の子ノードを持つことができるツリーです。例2-ary(バイナリ)ツリーには最大2つの子ノードがあります。 プレオーダートラバーサル ツリーのノードをトラバースする方法です。ここでは、最初にルートノードをトラバースし、次に左の子、次に右の子をトラバースします。 私たちの問題を理解するために例を見てみましょう Preorder traversal : 1215149941171