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

C++での二分木から二分探索木への変換


二分木 は、ツリーの各ノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。これらの子ノードは、右の子および左の子と呼ばれます。

単純な二分木は-

です

C++での二分木から二分探索木への変換

二分探索木(BST) は、次のルールに従う特殊なタイプのツリーです-

  • 左の子ノードの値は常に親よりも小さくなります注

  • 右側の子ノードは、親ノードよりも大きな値を持っています。

  • すべてのノードが個別に二分探索木を形成します。

二分探索木(BST)の例

C++での二分木から二分探索木への変換

バイナリ検索ツリーは、検索、最小値と最大値の検索などの操作の複雑さを軽減するために作成されます。

ここでは、二分木が与えられており、この二分木を変換する必要があります(BT) 二分探索木へ(BST) 。この変換では、バイナリツリーの元の構造を変更しないでください。

BTをBSTに変換する方法を理解するために例を見てみましょう −

入力C++での二分木から二分探索木への変換

出力C++での二分木から二分探索木への変換

この二分木から二分探索木への変換は、3つのステップを使用して行われます。彼らは-

ステップ1 −バイナリツリーを順番に配列に格納する arr []

ステップ2 −任意の並べ替え手法を使用して配列arr[]を並べ替えます。

ステップ3 −次に、ツリーを順番にトラバースし、配列の要素をツリーのノードに1つずつコピーします。

#include<stdio.h>
#include<stdlib.h>
struct node{
   int data;
   struct node *left;
   struct node *right;
};
void Inordertraversal(struct node* node, int inorder[], int *index_ptr){
   if (node == NULL)
      return;
   Inordertraversal(node->left, inorder, index_ptr);
   inorder[*index_ptr] = node->data;
   (*index_ptr)++;
   Inordertraversal(node->right, inorder, index_ptr);
}
int countNodes(struct node* root){
   if (root == NULL)
      return 0;
   return countNodes (root->left) +
   countNodes (root->right) + 1;
}
int compare (const void * a, const void * b){
   return( *(int*)a - *(int*)b );
}
void arrayToBST (int *arr, struct node* root, int *index_ptr){
   if (root == NULL)
      return;
   arrayToBST (arr, root->left, index_ptr);
   root->data = arr[*index_ptr];
   (*index_ptr)++;
   arrayToBST (arr, root->right, index_ptr);
}
struct node* newNode (int data){
   struct node *temp = new struct node;
   temp->data = data;
   temp->left = NULL;
   temp->right = NULL;
   return temp;
}
void printInorder (struct node* node){
   if (node == NULL)
      return;
   printInorder (node->left);
   printf("%d ", node->data);
   printInorder (node->right);
}
int main(){
   struct node *root = NULL;
   root = newNode(17);
   root->left = newNode(14);
   root->right = newNode(2);
   root->left->left = newNode(11);
   root->right->right = newNode(7);
   printf("Inorder Traversal of the binary Tree: \n");
   printInorder (root);
   int n = countNodes(root);
   int *arr = new int[n];
   int i = 0;
   Inordertraversal(root, arr, &i);
   qsort(arr, n, sizeof(arr[0]), compare);
   i = 0;
   arrayToBST (arr, root, &i);
   delete [] arr;
   printf("\nInorder Traversal of the converted BST: \n");
   printInorder (root);
   return 0;
}

出力

Inorder Traversal of the binary Tree:
11 14 17 2 7
Inorder Traversal of the converted BST:
2 7 11 14 17

  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 ++プログラムでの二分探索?

    二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要