Pythonで二分木が完全二分木かどうかを判定するプログラム
完全二分木とは
二分木が与えられたとき、その木が完全二分木(complete binary tree)であるかどうかを判定することを考えます。完全二分木とは、最後のレベルを除くすべてのレベルがノードで埋め尽くされており、最後のレベルのノードはすべて可能な限り左側に寄せられている二分木のことです。
例えば、次のような二分木が入力として与えられた場合、出力は True になります。

アルゴリズム(BFSによる判定方法)
この問題は、幅優先探索(BFS)を使って効率的に解けます。木をレベル順に走査し、初めて空のノード(None)が出現した後に再びノードが出現したら、その木は完全二分木ではないと判断できます。手順は以下の通りです。
- 両端キュー(deque)q を用意する。
- ルートを q の末尾に追加する。
- フラグ flag を False で初期化する。
- q が空になるまで、以下を繰り返す。
- temp に q の左端から取り出した要素を代入する。
- temp が None の場合は、flag を True にする。
- flag が True になっているのに temp が None でない場合は、False を返す。
- それ以外の場合は、temp の左の子と右の子を q の末尾に追加する。
- ループが正常に終了したら、True を返す。
Pythonでの実装例
from collections import deque
class TreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
class Solution:
def solve(self, root):
q = deque()
q.append(root)
flag = False
while q:
temp = q.popleft()
if not temp:
flag = True
elif flag and temp:
return False
else:
q.append(temp.left)
q.append(temp.right)
return True
ob = Solution()
root = TreeNode(9)
root.left = TreeNode(7)
root.right = TreeNode(10)
root.left.left = TreeNode(6)
root.left.right = TreeNode(8)
print(ob.solve(root))入力
root = TreeNode(9) root.left = TreeNode(7) root.right = TreeNode(10) root.left.left = TreeNode(6) root.left.right = TreeNode(8)
出力
True
計算量
このアルゴリズムでは各ノードを一度ずつ訪問するため、時間計算量は O(n)(n はノード数)です。また、キューには最大で O(n) 個の要素が格納される可能性があるため、空間計算量も O(n) となります。
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または
-
Pythonで二分木がヒープ(最大ヒープ)かどうかを判定する方法
この記事では、与えられた二分木がヒープ(最大ヒープ)であるかどうかをPythonで判定するアルゴリズムを解説します。再帰処理を使って「完全二分木であること」と「親子間の大小関係」を効率的にチェックする方法を、実装例とともに見ていきましょう。 ヒープの条件とは? ある二分木がヒープとみなされるためには、次の2つの性質を満たしている必要があります。 完全二分木であること:最後のレベルを除くすべての階層がノードで埋まっている状態になっている 最大ヒープの性質を持つこと:すべての親ノードの値が、その子ノードの値以上である たとえば、次のような木構造が入力として与えられた場合、これらの条件をすべて