二分木の表現

二分木は、コンピューターサイエンスで広く使われている基本的なデータ構造です。探索やソート、データの走査などの処理を効率よく行うアルゴリズムを構築する上で、特に有用です。
二分木はノードから構成され、それぞれのノードは最大で2つの子ノード(左の子と右の子)を持ちます。左と右の子ノードも同様に、さらに左と右の子ノードを持つ可能性があり、これ以上ノードがないところまでその構造が続きます。
木の最上部にあるノードはルート(根)と呼ばれ、一番下にあるノードは葉(リーフ)と呼ばれます。
このシンプルな仕組みによって、驚くほどさまざまなデータを効率的に表現でき、複数のプログラミング言語で容易に実装できます:
8つのノードから成る二分木。#1 のノードが木のルートであり、#4, #7, #8, #6 のノードがリーフとなっている。
8つのノードから成る二分木。#1 のノードが木のルートであり、#4, #7, #8, #6 のノードがリーフとなっている。
 
class Node:                       # 各ノードのデータを保持するためのNodeオブジェクト
    def __init__(self, value):    # 各ノードに保持する値(内容は何でも可)
        self.left = None          # 最初はleftとrightの両方がNone
        self.right = None
        self.value = value        # 値をオブジェクトとして保持する

# すべてのノードを手動で作成
root = Node(1)
root.left, root.right = Node(2), Node(3)
root.left.left, root.left.right = Node(4), Node(5)
root.left.right.left, root.left.right.right = Node(7), Node(8)
root.right.right = Node(6)

# ここからバイナリツリー全体を再帰的に走査できる
# すべてのノードの合計値を計算してみる
def treesum(node: Node | None) -> int:
    if node is None:
        return 0
    # 左部分木、右部分木、そして現在のノードの値を合計して返す
    return treesum(node.left) + treesum(node.right) + node.value

print(treesum(root))              # 36を出力
この例では、root から始めてすべてのノードを走査します。現在のノードが None であれば、そのパス上の部分木が終わったことを意味するため、合計として 0 を返します。そうでなければ、左部分木、右部分木、そして現在のノードの値を足し合わせ、その合計を返す仕組みになっています。

チャレンジ: 二分木を手動で作成

図に示されている二分木を、手動で作成するコードを書いてみてください。出力をする必要はありません。表示の部分は自動的に行われます。
 
 
notion image
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue