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

C++キューを使用してBSTのパスを逆にする


たとえば、二分探索木が与えられ、特定のキーからそのパスを逆にする必要があります。

C++キューを使用してBSTのパスを逆にする

C++キューを使用してBSTのパスを逆にする

解決策を見つけるためのアプローチ

このアプローチでは、キューを作成し、ルートを取得するまですべてのノードをプッシュします。

 
#include <bits/stdc++.h>
using namespace std;
struct node {
   int key;
   struct node *left, *right;
};
struct node* newNode(int item){
   struct node* temp = new node;
   temp->key = item;
   temp->left = temp->right = NULL;
   return temp;
}
void inorder(struct node* root){
   if (root != NULL) {
       inorder(root->left);
       cout << root->key << " ";
       inorder(root->right);
   }
}
void Reversing(struct node** node,
           int& key, queue<int>& q1){
   /* If the tree is empty then
   return*/
   if (node == NULL)
       return;
   if ((*node)->key == key){ // if we find the key
       q1.push((*node)->key); // we push it into our queue
       (*node)->key = q1.front(); // we change the first queue element with current
       q1.pop(); // we pop the first element
   }
   else if (key < (*node)->key){ // if key is less than current node's value
       q1.push((*node)->key); // we push the element in our queue
       Reversing(&(*node)->left, key, q1); //we go to the left subtree using a recursive call
       (*node)->key = q1.front(); //we reverse the elements
       q1.pop(); // we pop the first element
   }
   else if (key > (*node)->key){ // if key greater than node key then
       q1.push((*node)->key);// we push node key into queue
       Reversing(&(*node)->right, key, q1);// we go to right subtree using a recursive call
       (*node)->key = q1.front();// replace queue front to node key
       q1.pop(); // we pop the first element
   }
   return;
}
struct node* insert_node(struct node* node, // function to insert node nodes in our BST
                           int key){
   if (node == NULL)
       return newNode(key); // if tree is empty we return a new node
   if (key < node->key) // else we push that in our tree
       node->left = insert_node(node->left, key);
   else if (key > node->key)
       node->right = insert_node(node->right, key);
   return node; // returning the node
}
int main(){
   struct node* root = NULL;
   queue<int> q1;
   int k = 80;
/****************Creating the BST*************************/
   root = insert_node(root, 50);
   insert_node(root, 30);
   insert_node(root, 20);
   insert_node(root, 40);
   insert_node(root, 70);
   insert_node(root, 60);
   insert_node(root, 80);
   cout << "Before Reversing :" << "\n";
   inorder(root);
   cout << "\n";
   Reversing(&root, k, q1);
   cout << "After Reversing :" << "\n";
   // print inorder of reverse path tree
   inorder(root);
   return 0;
}

出力

Before Reversing :
20 30 40 50 60 70 80
After Reversing :
20 30 40 80 60 70 50

上記のコードの説明

このアプローチでは、指定されたキーを検索するだけです。ツリーをたどるときに、キュー内のすべてのノードをプッシュします。キーの値を持つノードが見つかったら、前にキューに入れられているすべてのパスノードの値を交換します。このプロセスでは、パスを交換します。逆になります。

結論

キューと再帰を使用してBSTのパスを逆にする問題を解決します。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(通常)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。


  1. C++で二重にリンクされたリストを使用した優先キュー

    データと優先度は整数値として与えられ、タスクは与えられた優先度に従って二重にリンクされたリストを作成し、結果を表示することです。 キューはFIFOデータ構造であり、最初に挿入された要素が最初に削除されます。優先度付きキューは、優先度に応じて要素を挿入または削除できるキューの一種です。キュー、スタック、またはリンクリストのデータ構造を使用して実装できます。優先キューは、次のルールに従って実装されます- 優先度が最も高いデータまたは要素は、優先度が最も低いデータまたは要素の前に実行されます。 2つの要素の優先度が、順番に実行される要素と同じである場合、それらはリストに追加されます。 優先

  2. クライアントサーバーモデルを使用してC/C++で文字列を反転します

    ここでは、システムを作成する方法を説明します。ここでは、1つのクライアントとサーバーを作成し、クライアントは1つの文字列をサーバーに送信でき、サーバーは文字列を逆にしてクライアントに戻ります。 ここでは、ソケットプログラミングの概念を使用します。クライアントサーバー接続を確立するには、ポートを作成する必要があります。ポート番号は、ソケットで使用できる任意の1つの番号です。接続を確立するには、クライアントとサーバーに同じポートを使用する必要があります。 プログラムを起動するには、最初にサーバープログラムを起動します- gcc Server.c –o server 次に、クライア