Pythonで二分木の対角線ごとの要素の合計を求める方法
問題の概要
二分木が与えられたとき、木の各対角線(右上から左下に向かう経路)ごとに、その対角線上のノード値の合計を求めることを考えます。
たとえば、次のような二分木が入力だったとします。

この場合、対角線は [12, 15]、[8, 10]、[3] の3本になるため、それぞれの合計を求めると出力は [27, 18, 3] となります。
アルゴリズム
この問題を解くには、次の手順に従います。まず traverse() 関数を定義します。この関数は node、numLeft、output の3つの引数を受け取ります。
nodeが null(None)の場合は、そのまま return します。numLeftがoutputのサイズ以上の場合は、nodeのデータをoutputの末尾に追加します。- それ以外の場合は、
output[numLeft] += node.dataとして該当する対角線の合計を更新します。 nodeの左の子が存在する場合は、traverse(node.left, numLeft + 1, output)を呼び出します。nodeの右の子が存在する場合は、traverse(node.right, numLeft, output)を呼び出します。
メインメソッドでは、以下の処理を行います。
- 結果を格納する新しいリスト
outputを作成します。 traverse(root, 0, output)を呼び出して探索を開始します。outputを返します。
ポイント解説
このアルゴリズムの鍵となるのは、「右方向への移動では同じ対角線にとどまり、左方向への移動で次の対角線に移る」という二分木の性質です。そのため、右の子へ再帰するときは numLeft をそのまま渡し、左の子へ再帰するときは numLeft + 1 を渡すことで、各ノードが属する対角線のインデックスを正しく管理できます。
実装例
理解を深めるために、以下のPythonによる実装例を見てみましょう。
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):
output = []
def traverse(node, numLeft, output):
if not node:
return
if numLeft >= len(output):
output.append(node.data)
else:
output[numLeft] += node.data
if node.left:
traverse(node.left, numLeft+1, output)
if node.right:
traverse(node.right, numLeft, output)
traverse(root, 0, output)
return output
ob = Solution()
root = TreeNode(12)
root.left = TreeNode(8)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(10)
print(ob.solve(root))
入力
root = TreeNode(12) root.left = TreeNode(8) root.right = TreeNode(15) root.left.left = TreeNode(3) root.left.right = TreeNode(10)
出力
[27, 18, 3]
-
Pythonで配列の合計を求める方法を徹底解説
この記事では、Pythonを使って配列(リスト)の合計を求める方法について詳しく解説します。 問題文 問題: 配列が与えられたとき、その配列に含まれるすべての要素の合計を計算してください。 最も基本的なアプローチは、配列全体を走査し、各インデックスの要素を順番に加算していく方法です。ここでは、まず組み込み関数を活用したシンプルな実装例を見ていきましょう。 方法1:組み込み関数 sum() を使う Pythonには、イテラブルなオブジェクトの合計を一発で計算できる組み込み関数 sum() が用意されています。これを使えば、コードは非常に簡潔になります。 サンプルコード # 合計を求める関数 de
-
Pythonで配列(リスト)の合計を求める方法をわかりやすく解説
この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に