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

C++で二分木をミラーツリーに変換する方法


このチュートリアルでは、二分木(バイナリツリー)をそのミラーツリーへ変換するC++プログラムについて解説します。

ここでは、ある一つの二分木が与えられるものとします。私たちの課題は、木の左側と右側を入れ替えることで、与えられた二分木からミラーツリーを作成することです。

ミラーツリーとは?

ミラーツリーとは、元の木を鏡に映したように左右を反転させた木のことです。すべてのノードで左の子と右の子が入れ替わるため、中間順走査(Inorder Traversal)の結果も完全に逆順になります。

アルゴリズムの考え方

変換には再帰呼び出しを利用します。各ノードに対して、まず左右の部分木をそれぞれ再帰的に反転し、その後、そのノード自身の左右ポインタを交換します。これにより木全体が反転され、処理の時間計算量はノード数に比例するO(n)で抑えられます。

実装例

#include<bits/stdc++.h>
using namespace std;
// 二分木のノード構造体
struct Node{
   int data;
   struct Node* left;
   struct Node* right;
};
// 子を持たない新しいノードの生成
struct Node* newNode(int data){
   struct Node* node = (struct Node*)malloc(sizeof(struct Node));
   node->data = data;
   node->left = NULL;
   node->right = NULL;
   return(node);
}
void mirror(struct Node* node){
   if (node == NULL)
      return;
   else{
      struct Node* temp;
      // 左右の部分木を再帰的に反転
      mirror(node->left);
      mirror(node->right);
      // 左右のポインタを交換
      temp = node->left;
      node->left = node->right;
      node->right = temp;
   }
}
// 中間順走査の結果を出力
void print_tree(struct Node* node){
   if (node == NULL)
      return;
   print_tree(node->left);
   cout << node->data << " ";
   print_tree(node->right);
}
int main(){
   struct Node *root = newNode(1);
   root->left = newNode(2);
   root->right = newNode(3);
   root->left->left = newNode(4);
   root->left->right = newNode(5);
   // 元の木の中間順走査を出力
   cout << "Inorder traversal of the constructed" << endl;
   print_tree(root);
   mirror(root);
   // ミラーツリーの中間順走査を出力
   cout << "\nInorder traversal of the mirror tree" << endl;
   print_tree(root);
   return 0;
}

出力

Inorder traversal of the constructed
4 2 5 1 3
Inorder traversal of the mirror tree
3 1 5 2 4

実行結果から、元の木の中間順走査「4 2 5 1 3」に対して、ミラーツリーでは「3 1 5 2 4」と完全に逆順に出力されていることが確認できます。このように、再帰的な左右の入れ替えを行うだけで、シンプルかつ効率的に二分木を反転することが可能です。

  1. C++で二分木を剪定する:1を含まない部分木を削除する再帰アルゴリズム

    問題概要二分木のルートノード root が与えられ、すべてのノードの値は 0 または 1 のいずれかであるとします。この木から、1 を含まないすべての部分木を削除した結果の木を求めるのが目的です。たとえば、次のような木が与えられた場合 −解決のためのアプローチこの問題は、再帰的な手法を用いて以下の手順で解決できます −ノードを引数として受け取る再帰メソッド solve() を定義します。処理の流れは次のとおりです −ノードが null の場合は、null を返しますノードの左の子に対して solve(左の子) を実行し、その結果を左の子に代入しますノードの右の子に対して solve(右の子)

  2. C++で二分探索木(BST)にノードを挿入する方法を解説

    二分探索木(Binary Search Tree、BST)が与えられたとします。ここでは、挿入したいノードをパラメータとして受け取り、挿入操作を行うメソッドを1つだけ実装します。重要なポイントは、挿入操作を行った後も木がBSTの性質(左の子 < 親 < 右の子)を維持していることです。例えば、次のようなBSTがあるとします。この木に「5」を挿入すると、BSTの規則に従って適切な位置が探索され、木は次のようになります。解決のためのアプローチこの問題は、再帰を使うことでシンプルに解くことができます。手順は以下の通りです。insert() という再帰的なメソッドを実装します。引数として挿入する値 v