Pythonで二分木のすべての葉が同じレベルにあるかどうかを確認するプログラム
二分木が与えられたとき、そのすべての葉(リーフノード)が同じレベル(同じ深さ)に存在するかどうかを判定する問題を考えてみましょう。
例えば、次のような二分木が入力として与えられた場合、

出力は True になります。
解決のアプローチ
この問題を解くために、以下の手順に従います。
- dfs() という関数を定義します。この関数は root(現在のノード)と d(現在の深さ)を受け取ります。
- root が null でない場合、以下の処理を行います。
- root の左の子と右の子がどちらも null の場合(つまり葉ノードの場合)、d を depth リストの末尾に追加します。
- それ以外の場合は、再帰的に探索を続けます。
- dfs(root の左の子, d + 1)
- dfs(root の右の子, d + 1)
- メインの処理では、以下を実行します。
- depth := 新しい空のリストを作成
- dfs(root, 0) を呼び出して全ノードを走査
- depth リストに含まれる値が1種類だけなら True を返す(すべての葉が同じ深さにあることを意味する)
実装例
理解を深めるために、以下の実装を見てみましょう。
class TreeNode:
def __init__(self, value):
self.val = value
self.left = None
self.right = None
class Solution:
def solve(self, root):
self.depth = []
self.dfs(root, 0)
return len(set(self.depth)) == 1
def dfs(self, root, depth):
if root:
if not root.left and not root.right:
self.depth.append(depth)
else:
self.dfs(root.left, depth + 1)
self.dfs(root.right, depth + 1)
ob = Solution()
root = TreeNode(5)
root.left = TreeNode(4)
root.left.left = TreeNode(2)
root.right = TreeNode(10)
root.right.left = TreeNode(7)
root.right.right = TreeNode(15)
print(ob.solve(root))入力
root = TreeNode(5) root.left = TreeNode(4) root.left.left = TreeNode(2) root.right = TreeNode(10) root.right.left = TreeNode(7) root.right.right = TreeNode(15)
出力
True
コードのポイント
このアルゴリズムの核心は、DFS(深さ優先探索)を使って木を走査し、葉ノードに到達した時点での深さを記録することです。最後に set() を使って depth リスト内の値を重複排除し、要素数が1であれば「すべての葉が同じ深さにある」と判断できます。計算量は木のノード数に対して O(n)、空間計算量も O(n) となり、効率的な解法です。
-
Pythonで二分木が二分探索木(BST)かどうかを判定する方法
はじめに:BSTとは何か二分木が与えられたとき、それが二分探索木(Binary Search Tree:BST)であるかどうかを判定することは、データ構造の学習やコーディング面接でよく出題される定番の問題です。BSTには以下のような重要な性質があります。左部分木に含まれるすべてのノードの値は、現在のノードの値より小さい右部分木に含まれるすべてのノードの値は、現在のノードの値より大きいこれらの性質は、木の中のすべてのノードに対して再帰的に成り立つたとえば、次のような二分木を考えてみましょう。ルート:5左の子:1右の子:9(その左の子:7、さらに左の子:6・右の子:8/右の子:10)この場合、すべ
-
Pythonで二分探索木(BST)に特定の値が存在するかどうかを判定する方法
問題の概要二分探索木(BST:Binary Search Tree)と、探索対象となる値 val が与えられたとき、その値が木の中に存在するかどうかを判定するプログラムを作成します。例えば、次のような二分探索木があったとします。このとき val = 7 とすると、7は木の中に存在するため、出力は True になります。アルゴリズムの手順BSTの性質を利用すると、効率的に値を探索できます。手順は以下の通りです。関数 solve() を定義します。引数として root(現在のノード)と val を受け取ります。root が null(None)の場合は False を返します。root のデータが