C#の反復処理を使って木(ツリー)が対称かどうかを判定する方法
反復アプローチによる対称木の判定
反復(イテレーティブ)なアプローチでは、2つのキューを作成します。1つ目のキューは左側の子ノードを保存し、2つ目のキューは右側の子ノードを保存する役割を担います。
木が空である場合、その木は根ノードを通る垂直軸に対して対称であるとみなされ、true を返します。木が空でない場合は、まず両部分木の根ノードの値が一致しているかを確認します。値が一致していれば、さらに左部分木と右部分木が互いに対称(鏡像)であるかを順番に検証していきます。具体的には、キュー1には「左の子→右の子」の順で子ノードを追加し、キュー2には「右の子→左の子」の順で追加することで、左右を反転させた比較が可能になります。
アルゴリズムの手順
- 根ノードが null の場合は true を返します(空の木は対称とみなされる)。
- キューQ1に根の左の子を、キューQ2に根の右の子をそれぞれ追加します。
- 両方のキューが空になるまで、次の処理を繰り返します。
- 各キューからノードを1つずつ取り出します。
- 片方だけが null の場合は false を返します。
- 両方が null でない場合、値が異なれば false を返します。
- Q1には左の子・右の子の順で、Q2には右の子・左の子の順で子ノードを追加します。
- ループが正常に完了すれば、木は対称なので true を返します。
サンプルコード
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 bool IsSymmetricIterative(Node node){
if (node == null){
return true;
}
Queue<Node> q1 = new Queue<Node>();
Queue<Node> q2 = new Queue<Node>();
q1.Enqueue(node.LeftChild);
q2.Enqueue(node.RightChild);
while (q1.Count > 0 && q2.Count > 0){
Node n1 = q1.Dequeue();
Node n2 = q2.Dequeue();
if ((n1 == null && n2 != null) || (n1 != null && n2 == null)){
return false;
}
if (n1 != null){
if (n1.Value != n2.Value){
return false;
}
q1.Enqueue(n1.LeftChild);
q1.Enqueue(n1.RightChild);
q2.Enqueue(n2.RightChild);
q2.Enqueue(n2.LeftChild);
}
}
return true;
}
}出力例
1
2 2
3 4 4 3
True
この例では、木が左右で完全な鏡像構造になっているため、IsSymmetricIterative メソッドは True を返します。もし左右の値や構造が一致しないノードが存在した場合は、その時点で false が返されます。
-
Pythonで二分木が対称木(シンメトリックツリー)かどうかを判定するプログラム
ある二分木が与えられたとき、その木が対称木(シンメトリックツリー)であるかどうかを判定します。対称木とは、鏡像(左右反転した像)をとったときに元の木と完全に一致するような木のことです。例えば、左右の子部分木が互いに鏡写しの関係になっている木は対称木とみなされます。この判定を行うためのアプローチは以下の通りです。解法の考え方再帰的に処理を行う関数 solve(root, root) を呼び出します。同じノードを2つの引数として渡すのがポイントです。比較対象の2つのノード(node1 と node2)がどちらも空(None)の場合、True を返します。どちらか一方だけが空の場合、構造が一致してい
-
Pythonで文字列が回文かどうかを判定する方法
Pythonで回文判定を行う方法文字列が回文(前から読んでも後ろから読んでも同じになる文字列)であるかどうかを確認するには、Pythonの標準ライブラリに含まれる reversed() 関数を利用するのが便利です。この関数は逆順のイテレータオブジェクトを返し、それを list() でリストに変換することができます。手順1:reversed()で文字列を逆順にするまず、対象となる文字列を reversed() 関数に渡し、結果をリストとして取得します。>>> str1=malayalam >>> l1=list(reversed(str1)) >>