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

バイナリツリーをスレッド化されたバイナリツリーに変換する| C ++でセット1(キューを使用)


このチュートリアルでは、キューデータ構造を使用してバイナリツリーをスレッド化されたバイナリツリーに変換するプログラムについて説明します。

このために、二分木が提供されます。私たちのタスクは、キューデータ構造の助けを借りて、より迅速な順序トラバーサルのためにルートを追加することにより、その特定のバイナリツリーをスレッド化されたバイナリツリーに変換することです。

#include <iostream>
#include <queue>
using namespace std;
//node structure for threaded tree
struct Node {
   int key;
   Node *left, *right;
   bool isThreaded;
};
//putting the inorder pattern into a queue
void convert_queue(Node* root, std::queue<Node*>* q){
   if (root == NULL)
      return;
   if (root->left)
      convert_queue(root->left, q);
   q->push(root);
   if (root->right)
      convert_queue(root->right, q);
}
//traversing the queue and making threaded tree
void create_threadedtree(Node* root, std::queue<Node*>* q){
   if (root == NULL)
      return;
   if (root->left)
      create_threadedtree(root->left, q);
   q->pop();
   if (root->right)
      create_threadedtree(root->right, q);
   //if right pointer in NUll, point it to
   //inorder successor
   else {
      root->right = q->front();
      root->isThreaded = true;
   }
}
//finally taking the tree and converting it into threaded
void createThreaded(Node* root){
   std::queue<Node*> q;
   convert_queue(root, &q);
   create_threadedtree(root, &q);
}
Node* leftMost(Node* root){
   while (root != NULL && root->left != NULL)
      root = root->left;
      return root;
   }
   //performing inorder traversal of threaded tree
   void inOrder(Node* root){
      if (root == NULL)
         return;
      Node* cur = leftMost(root);
      while (cur != NULL) {
         cout << cur->key << " ";
         //if threaded node, move to inorder successor
         if (cur->isThreaded)
            cur = cur->right;
         else
            cur = leftMost(cur->right);
      }
   }
   Node* newNode(int key){
      Node* temp = new Node;
      temp->left = temp->right = NULL;
      temp->key = key;
      return temp;
}
int main(){
   Node* root = newNode(1);
   root->left = newNode(2);
   root->right = newNode(3);
   root->left->left = newNode(4);
   root->left->right = newNode(5);
   root->right->left = newNode(6);
   root->right->right = newNode(7);
   createThreaded(root);
   cout << "Traversing threaded tree :\n";
   inOrder(root);
   return 0;
}

出力

Traversing threaded tree :
4 2 5 1 6 3 7

  1. バイナリツリーをC++のリンクリストにフラット化する

    二分木があるとしましょう。リンクリストにフラット化する必要があります。したがって、ツリーが次のような場合- 出力ツリーは-になります これを解決するには、次の手順に従います- ser prev:=null rootを入力として受け取る再帰関数solve()を定義します。 ルートがnullの場合は、を返します。 解決(ルートの権利) 解決(ルートの左側) ルートの右側:=prev、ルートの左側:=null 前:=ルート 理解を深めるために、次の実装を見てみましょう- 例 #include <bits/stdc+

  2. C++での二分木レベルの順序トラバーサル

    二分木があるとします。レベル順トラバーサルスキームを使用して、このツリーをトラバースする必要があります。したがって、ツリーが次のような場合 トラバーサルシーケンスは次のようになります-[10、5、16、8、15、20、23] これを解決するには、次の手順に従います- ノードを格納するためのキューキューを定義する ルートをキューに挿入します。 queが空でない間は、 item:=キューの最前列にあるアイテム アイテムの価値を印刷する アイテムの左側がnullでない場合は、アイテムの左側をqueに挿入します アイテムの権利がnullでない場合は、アイテムの権利をqueに挿入します