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

STLセットC++を使用した二分木から二分探索木への変換?


特定のバイナリツリーの場合、バイナリツリーの元の構造をそのまま維持するような方法でバイナリ検索ツリーに変換します。

このソリューションでは、アレイベースのソリューションではなく、C++STLのセットが使用されます。

例1

入力

     11
    /  \
   3    8
/     \
9 5

出力

     9
   /   \
  5     11
 /        \
3        8

例2

入力

      11
     /   \
    31    16
   /        \
 21         6

出力

     16
    /   \
  11     21
 /         \
 6          31

解決策

  • インオーダートラバーサルを実行しながら、セット内のバイナリツリーのアイテムをコピーする必要があります。これはO(n log n)時間を消費します。 C ++ STL(標準テンプレートライブラリ)での設定は、赤黒木、AVLツリーなどの自己平衡二分探索木を使用して実装されていることに注意してください。

  • C ++のセットは、自己平衡二分探索木を実装するために使用されるため、セットを並べ替える必要はありません。これにより、挿入、検索、削除などの各操作でO(log n)時間が消費されます。

  • これで、ツリーの順番な走査を実行しながら、セットの要素を最初からツリーに1つずつ簡単にコピーできます。セットの各アイテムを最初からコピーするときは注意が必要です。最初に順番にトラバーサルを実行しながらツリーにコピーしてから、セットからも削除します。

  • 現在、上記のソリューションは、ここで説明されているバイナリツリーからバイナリ検索ツリーへの配列ベースの変換よりも簡単で実装が簡単です。

ここでは、setを使用してバイナリツリーをバイナリ検索ツリー(BST)に変換する次のプログラムについて説明します。

/* CPP program for converting a Binary tree to BST implementing sets as containers. */
#include <bits/stdc++.h>
using namespace std;
struct Node1 {
   int data;
   struct Node1 *left, *right;
};
// function for storing the nodes in set while performing inorder traversal.
void storeinorderInSet(Node1* root1, set<int>& s){
   if (!root1)
   return;
   // Left subtree is visited first
   storeinorderInSet(root1->left, s);
   Order of O(logn) for sets is taken by insertion
   s.insert(root1->data);
   // We visit the right subtree
   storeinorderInSet(root1->right, s);
} // Time complexity = O(nlogn)
// function for copying elements of set one by one to the tree while performing inorder traversal
void setToBST(set<int>& s, Node1* root1){
   // base condition
   if (!root1) return;
   // We first move to the left subtree and update elements
   setToBST(s, root1->left);
   // iterator initially pointing to the starting of set
   auto it = s.begin();
   // We copy the element at sarting of set(sorted) to the tree.
   root1->data = *it;
   // now we erase the starting element from set.
   s.erase(it);
   // now we move to right subtree and update elements
   setToBST(s, root1->right);
}
// T(n) = O(nlogn) time
// We convert Binary tree to BST.
void binaryTreeToBST(Node1* root1){
   set<int> s;
   // We populate the set with the tree's inorder traversal data
   storeinorderInSet(root1, s);
   // At present sets are by default sorted as they are used
   implementing self-balancing BST
   // We copy elements from set to the tree while inorder traversal
   which makes a BST
   setToBST(s, root1);
}
// Time complexity = O(nlogn),
// Auxiliary Space = O(n) for set.
// helper function for creating a node
Node1* newNode(int data){
   // dynamically allocating memory
   Node1* temp = new Node1();
   temp->data = data;
   temp->left = temp->right = NULL;
   return temp;
}
// function for doing inorder traversal
void inorder(Node1* root1){
   if (!root1)
   return;
   inorder(root1->left);
   cout<< root1->data << " ";
   inorder(root1->right);
}
int main(){
   Node1* root1 = newNode(6);
   root1->left = newNode(8);
   root1->right = newNode(10);
   root1->right->left = newNode(11);
   root1->left->left = newNode(2);
   root1->left->right = newNode(7);
   root1->right->right = newNode(12);
   /* Building tree given in the following figure
      6
      / \
      8 10
      /\ / \
      2 7 11 12 */
   // We convert the above Binary tree to BST
   binaryTreeToBST(root1);
   cout<< "Inorder traversal of BST is: " << endl;
   inorder(root1);
   return 0;
}

出力

Inorder traversal of BST is:
1 5 6 7 9 10 11

時間計算量は次のように表されます:O(n Log n)

補助スペースは次のように表されます:(n)


  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++での二分木から二分探索木への変換

    二分木 は、ツリーの各ノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。これらの子ノードは、右の子および左の子と呼ばれます。 単純な二分木は-です 二分探索木(BST) は、次のルールに従う特殊なタイプのツリーです- 左の子ノードの値は常に親よりも小さくなります注 右側の子ノードは、親ノードよりも大きな値を持っています。 すべてのノードが個別に二分探索木を形成します。 二分探索木(BST)の例 − バイナリ検索ツリーは、検索、最小値と最大値の検索などの操作の複雑さを軽減するために作成されます。 ここでは、二分木が与えられており、