C++で二分木のミラー(鏡像)を作成する方法
このチュートリアルでは、C++を使って与えられた二分木を反転させ、ミラーツリー(鏡像木)を作成する方法を解説します。
ミラーツリーとは、元の木の左右の子をすべて入れ替えた状態の木のことです。それでは、問題を解くための手順を見ていきましょう。
解決手順
- ノードを表す構造体(struct Node)を定義します。
- ダミーデータを使って二分木を構築します。
- 与えられた二分木のミラーを求める再帰関数を作成します。
- 左の子ノードと右の子ノードに対して再帰的に関数を呼び出します。
- 左の子と右の子を入れ替えます。
- 結果の木を出力して確認します。
サンプルコード
実際のコードを見てみましょう。
#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 = new Node;
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void convertTreeToItsMirror(struct Node* node) {
if (node == NULL) {
return;
}
else {
struct Node* temp;
convertTreeToItsMirror(node->left);
convertTreeToItsMirror(node->right);
temp = node->left;
node->left = node->right;
node->right = temp;
}
}
void printTree(struct Node* node) {
if (node == NULL) {
return;
}
printTree(node->left);
cout << node->data << " ";
printTree(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 << "Tree: ";
printTree(root);
cout << endl;
convertTreeToItsMirror(root);
cout << "Mirror of the Tree: ";
printTree(root);
cout << endl;
return 0;
}実行結果
上記のコードを実行すると、以下のような出力が得られます。
Tree: 4 2 5 1 3 Mirror of the Tree: 3 1 5 2 4
コードのポイント
このアルゴリズムの計算量は、木のノード数を n とすると O(n) です。各ノードを一度だけ訪問し、左右の子ポインタを入れ替えるだけなので非常に効率的です。また、再帰の深さは木の高さに依存するため、最悪の場合(偏った木)には O(n) のスタック領域が必要になります。
まとめ
このように、シンプルな再帰処理だけで二分木のミラーを作成することができます。チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。
-
【C++】二分木の中順走査(Inorder Traversal)を再帰的に実装する方法
木の走査(Tree Traversal)は、グラフ走査の一種であり、木に含まれるすべてのノードをそれぞれ一度だけ訪問(チェックまたは出力)する操作です。二分探索木における中順走査(Inorder Traversal、通りがけ順とも呼ばれます)では、「左の子 → 根 → 右の子」の順序で各ノードを訪問します。 二分木の中順走査の具体例を見てみましょう。次のような二分木が与えられたとします。 この二分木に対する中順走査の結果は次のとおりです。 中順走査の結果:1 4 5 6 8 それでは、中順走査を再帰的に実行するC++プログラムを見ていきましょう。 サンプルコード #include<i
-
二分木の先行順(プレオーダー)走査を再帰的に実行するC++プログラム
二分木の先行順走査とは木の走査(トラバーサル)はグラフ走査の一種であり、木に含まれるすべてのノードをそれぞれ一度だけ訪れて処理を行うことを指します。二分探索木における先行順走査(プレオーダー走査)では、「根 → 左部分木 → 右部分木」の順序で各ノードを訪問するのが特徴です。次のような二分木を例に考えてみましょう。この二分木に対する先行順走査の結果は 6 4 1 5 8 となります。ここからは、この先行順走査を再帰的に実行するC++プログラムを紹介します。C++による実装例#include<iostream> using namespace std; struct node {