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

C#で再帰を使って二分探索木を反転(ミラー化)する方法


二分探索木(Binary Search Tree)を反転するとは、木の左右を入れ替えて、木全体を鏡像に変換することです。本記事では、C#の再帰処理を用いて二分探索木を反転する方法を、コード例とともにわかりやすく解説します。

反転の基本的な考え方

まず、InvertABinarySearchTree メソッドを呼び出し、対象のノードを引数として渡します。このメソッドの処理の流れは以下の通りです。

  • ノードが null の場合は、そのまま null を返します(ベースケース)。
  • ノードが null でない場合は、左の子と右の子それぞれに対して InvertABinarySearchTree を再帰的に呼び出します。
  • 再帰呼び出しの結果を受け取り、右の子の値を左の子に、左の子の値を右の子に代入して左右を入れ替えます。

この処理をすべてのノードに適用することで、最終的な出力は元の木の鏡像となります。

実装例

public class TreesPgm{
    public class Node{
        public int Value;
        public Node LeftChild;
        public Node RightChild;
        public Node(int value){
            this.Value = value;
        }
        public override String ToString(){
            return "Node=" + Value;
        }
    }
    public Node InvertABinarySearchTree(Node node){
        if (node == null){
            return null;
        }
        Node left = InvertABinarySearchTree(node.LeftChild);
        Node right = InvertABinarySearchTree(node.RightChild);
        node.LeftChild = right;
        node.RightChild = left;
        return root;
    }
}

コードのポイント

  • ベースケース: ノードが null のときに null を返すことで、再帰の無限ループを防いでいます。
  • 再帰的な左右の反転: 左右の子部分木をそれぞれ先に反転してから、親ノードの左右ポインタを入れ替えます。
  • 計算量: 各ノードを一度だけ訪問するため、時間計算量は O(n)、再帰の深さは木の高さに依存します。

入力例

    1
  3   2

出力例

    1
  2   3

入力ではルート「1」の左に「3」、右に「2」が配置されていますが、反転後は左右が入れ替わり、「2」が左に、「3」が右に配置されていることが確認できます。このように再帰を活用すると、シンプルなコードで木構造の反転を実現できます。

  1. C++とOpenCVで二値画像(バイナリイメージ)を反転する方法

    二値画像(バイナリイメージ)の反転とは、ピクセル値を逆転させる処理のことです。視覚的な観点から見ると、二値画像を反転させると、白いピクセルは黒へ、黒いピクセルは白へと変換されます。この処理は、主に3つの関数を組み合わせて実現します。それぞれの手順を順番に見ていきましょう。ステップ1:カラー画像をグレースケールに変換するまず、cvtColor()関数を使って元の画像をグレースケール画像に変換します。この関数の基本形は次の通りです。cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);ステップ2:グレースケール画像を二値化する続いて、グ

  2. C++でRMQ(区間最小値クエリ)を使って二分木のLCA(最小共通祖先)を求める方法

    概念本記事では、根付き木における2つのノードのLCA(最小共通祖先)を求める問題を、RMQ(区間最小値クエリ)の問題へ帰着させることで解く手法について解説します。用語の整理根付き木Tにおいて、2つのノードaとbの最小共通祖先(Lowest Common Ancestor:LCA)とは、aとbの両方を子孫として持つノードのうち、根から最も遠い位置にあるノードを指します。例えば、下図のように、ノードDとノードIのLCAはノードBになります。LCA問題はさまざまなアプローチで解くことが可能で、それぞれ時間計算量や空間計算量が異なります。区間最小値クエリ(Range Minimum Query:RMQ