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

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) のスタック領域が必要になります。

まとめ

このように、シンプルな再帰処理だけで二分木のミラーを作成することができます。チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

  1. 【C++】二分木の中順走査(Inorder Traversal)を再帰的に実装する方法

    木の走査(Tree Traversal)は、グラフ走査の一種であり、木に含まれるすべてのノードをそれぞれ一度だけ訪問(チェックまたは出力)する操作です。二分探索木における中順走査(Inorder Traversal、通りがけ順とも呼ばれます)では、「左の子 → 根 → 右の子」の順序で各ノードを訪問します。 二分木の中順走査の具体例を見てみましょう。次のような二分木が与えられたとします。 この二分木に対する中順走査の結果は次のとおりです。 中順走査の結果:1 4 5 6 8 それでは、中順走査を再帰的に実行するC++プログラムを見ていきましょう。 サンプルコード #include<i

  2. 二分木の先行順(プレオーダー)走査を再帰的に実行するC++プログラム

    二分木の先行順走査とは木の走査(トラバーサル)はグラフ走査の一種であり、木に含まれるすべてのノードをそれぞれ一度だけ訪れて処理を行うことを指します。二分探索木における先行順走査(プレオーダー走査)では、「根 → 左部分木 → 右部分木」の順序で各ノードを訪問するのが特徴です。次のような二分木を例に考えてみましょう。この二分木に対する先行順走査の結果は 6 4 1 5 8 となります。ここからは、この先行順走査を再帰的に実行するC++プログラムを紹介します。C++による実装例#include<iostream> using namespace std; struct node {