💬

2分木探索(通りがけ順)をPythonで表現してみる

2023/04/01に公開

木構造の表現方法

木構造を2次元配列で表現しています。
Nodes[Node[Left, Right, Data]]

  • Left , Right : 連結するNodeのインデックス
  • Data : Nodeに含まれるデータ
node_data = [
    [1,    2,    10],
    [3,    4,     5],
    [5,    None, 12],
    [None, None,  2],
    [6,    7,     8],
    [None, None, 11],
    [None, None,  6],
    [None, None,  9]
]

木構造のイラスト

[インデックス : データ]

プログラム

NodeClass

from typing import Any, List, Optional

class Node:
    """二分木のノードを表現するクラス"""
    
    def __init__(self, left: Optional[int] = None, right: Optional[int] = None, data: Any = None):
        self.left = left
        self.right = right
        self.data = data

BinaryTreeClass

class BinaryTree:
    """二分木を表現するクラス"""
    
    def __init__(self, nodes_data: List[List[Any]]):
        self.nodes = [Node(*node_data) for node_data in nodes_data]

    def in_order_traversal(self, index: int = 0) -> None:
        """
        二分木を通りがけ順(左、ルート、右)で巡回する。
        
        :param index: 巡回中の現在のノードのインデックス。
        """
        if index is not None:
            node = self.nodes[index]
            self.in_order_traversal(node.left)
            print(node.data)
            self.in_order_traversal(node.right)

実行ファイル

# 与えられたデータで二分木を初期化
node_data = [
    [1,    2,    10],
    [3,    4,     5],
    [5,    None, 12],
    [None, None,  2],
    [6,    7,     8],
    [None, None, 11],
    [None, None,  6],
    [None, None,  9]
]

# BinaryTreeオブジェクトを作成し、通りがけ順で巡回する
binary_tree = BinaryTree(node_data)
binary_tree.in_order_traversal()

実行結果のトレース表

このプログラムの実行結果のトレース表は以下のとおりです。

ステップ 関数/メソッド インデックス ノードデータ 操作内容
1 in_order_traversal 0 10 左子ノードへ移動
2 in_order_traversal 1 5 左子ノードへ移動
3 in_order_traversal 3 2 左子ノードへ移動(None)
4 in_order_traversal 3 2 データを表示(2)
5 in_order_traversal 3 2 右子ノードへ移動(None)
6 in_order_traversal 1 5 データを表示(5)
7 in_order_traversal 1 5 右子ノードへ移動
8 in_order_traversal 4 8 左子ノードへ移動
9 in_order_traversal 6 6 左子ノードへ移動(None)
10 in_order_traversal 6 6 データを表示(6)
11 in_order_traversal 6 6 右子ノードへ移動(None)
12 in_order_traversal 4 8 データを表示(8)
13 in_order_traversal 4 8 右子ノードへ移動
14 in_order_traversal 7 9 左子ノードへ移動(None)
15 in_order_traversal 7 9 データを表示(9)
16 in_order_traversal 7 9 右子ノードへ移動(None)
17 in_order_traversal 0 10 データを表示(10)
18 in_order_traversal 0 10 右子ノードへ移動
19 in_order_traversal 2 12 左子ノードへ移動
20 in_order_traversal 5 11 左子ノードへ移動(None)
21 in_order_traversal 5 11 データを表示(11)
22 in_order_traversal 5 11 右子ノードへ移動(None)
23 in_order_traversal 2 12 データを表示(12)
24 in_order_traversal 2 12 右子ノードへ移動(None)

プログラム全体の実行結果は以下のようになります。

実行結果

二分探索木を通りがけ順に巡回
2
5
6
8
9
10
11
12

Discussion