Pythonで二分木の最大深度を求める方法|再帰を使った実装例を解説
Pythonで二分木の最大深度を求める
二分木が与えられたとき、その最大深度を求める問題を考えます。木の最大深度とは、根(ルート)から葉ノードまでの最も長い経路をたどったときに通過するノード数のことです。
例えば、下図のような二分木の場合、最大深度は 3 となります。

解法のアプローチ
この問題は再帰を使うことで、非常にシンプルに解くことができます。手順は以下のとおりです。
- 再帰用のヘルパーメソッド
solve(root, depth=0)を定義します。 rootが空(None)の場合は、そこまでの深さdepthをそのまま返します。- それ以外の場合は、左部分木に対する
solve(left, depth+1)と右部分木に対するsolve(right, depth+1)のうち、大きい方の値を返します。
各ノードを一段深く潜るごとに depth を1ずつ増やしていき、葉に到達した時点での深さを返すことで、自動的に最長経路の長さが求まります。
実装例
以下にPythonでの実装例を示します。
class TreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def insert(temp, data):
que = []
que.append(temp)
while len(que):
temp = que[0]
que.pop(0)
if not temp.left:
if data is not None:
temp.left = TreeNode(data)
else:
temp.left = TreeNode(0)
break
else:
que.append(temp.left)
if not temp.right:
if data is not None:
temp.right = TreeNode(data)
else:
temp.right = TreeNode(0)
break
else:
que.append(temp.right)
def make_tree(elements):
Tree = TreeNode(elements[0])
for element in elements[1:]:
insert(Tree, element)
return Tree
class Solution(object):
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
return self.solve(root)
def solve(self, root, depth=0):
if root == None:
return depth
return max(self.solve(root.left, depth+1),
self.solve(root.right, depth+1))
tree1 = make_tree([1,2,2,3,4,None,3])
ob1 = Solution()
print(ob1.maxDepth(tree1))入力
tree1 = make_tree([1,2,2,3,4,None,3])
出力
3
コードの解説
- TreeNodeクラス:各ノードはデータ(
data)、左の子(left)、右の子(right)を持ちます。 - insert関数・make_tree関数:リスト形式のデータから幅優先(BFS)の要領で二分木を構築する補助関数です。
Noneが渡された場合はダミーノードを挿入します。 - maxDepthメソッド:外部からのエントリーポイントであり、内部で
solveを呼び出します。 - solveメソッド:再帰の本体です。ノードが存在しない地点に到達したときの
depthを返し、左右の結果の最大値を上位に伝播させることで、木全体の最大深度が得られます。
計算量について
- 時間計算量:O(n) ― 各ノードをちょうど1回ずつ訪問するため、ノード数 n に比例した処理時間となります。
- 空間計算量:O(h) ― 再帰呼び出しのスタックの深さは木の高さ h に依存します。木が片側に偏っている最悪ケースでは O(n) になります。
-
Pythonで二分木を反転する方法:再帰を使った実装を解説
二分木の反転とは二分木が与えられたとき、その左右の子ノードを入れ替えて「鏡像」のような木を作ることを二分木の反転(Invert Binary Tree)と呼びます。これはアルゴリズムの学習やコーディング面接でも頻出のトピックです。例えば、次のような二分木があったとします。これを反転すると、すべてのノードの左部分木と右部分木が入れ替わり、以下のような木になります。解き方:再帰的アプローチこの問題は再帰を使うと非常にシンプルに解けます。考え方は以下の3ステップです。ルートが None(null)であれば、そのまま返す(ベースケース)現在のノードの左ポインタと右ポインタを入れ替える左部分木と右部分木
-
Pythonで二分木の最大深度を求める方法|再帰を使った実装例を解説
Pythonで二分木の最大深度を求める二分木が与えられたとき、その最大深度を求める問題を考えます。木の最大深度とは、根(ルート)から葉ノードまでの最も長い経路をたどったときに通過するノード数のことです。例えば、下図のような二分木の場合、最大深度は 3 となります。解法のアプローチこの問題は再帰を使うことで、非常にシンプルに解くことができます。手順は以下のとおりです。再帰用のヘルパーメソッド solve(root, depth=0) を定義します。root が空(None)の場合は、そこまでの深さ depth をそのまま返します。それ以外の場合は、左部分木に対する solve(left, dep