Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで二項ツリー(二項木)を実装する方法:オブジェクト指向による実装例

Pythonで二項ツリー(Binomial Tree)を実装するには、オブジェクト指向のアプローチを利用するのが効果的です。具体的には、クラスを定義し、その中に属性や操作用のメソッドを持たせます。クラスのインスタンスを生成することで、実際に二項ツリーの作成や結合といった操作を行えるようになります。

この記事では、ユーザーが対話的に操作できるメニュー形式のサンプルプログラムを通じて、二項ツリーの基本的な実装方法を解説します。

サンプルコード

class binomial_tree:
    def __init__(self, key):
        self.key = key
        self.children = []
        self.order = 0
    def add_at_end(self, t):
        self.children.append(t)
        self.order = self.order + 1
my_tree = []
print('Menu')
print('create <key>')
print('combine <index1> <index2>')
print('exit')
while True:
    option = input('What do you wish like to do? ').split()
    operation = option[0].strip().lower()
    if operation == 'create':
        key = int(option[1])
        b_tree = binomial_tree(key)
        my_tree.append(b_tree)
        print('Binomial tree has been created.')
    elif operation == 'combine':
        index_1 = int(option[1])
        index_2 = int(option[2])
        if my_tree[index_1].order == my_tree[index_2].order:
            my_tree[index_1].add_at_end(my_tree[index_2])
            del my_tree[index_2]
            print('Binomial trees have been combined.')
        else:
            print('Order of trees need to be the same to combine them.')
    elif operation == 'exit':
        print("Exit")
        break
    print('{:>8}{:>12}{:>8}'.format('Index', 'Root key', 'Order'))
    for index, t in enumerate(my_tree):
        print('{:8d}{:12d}{:8d}'.format(index, t.key, t.order))

実行結果

Menu
create <key>
combine <index1> <index2>
exit
What do you wish like to do? create 7
Binomial tree has been created.
Index Root key Order
0 7 0
What do you wish like to do? create 11
Binomial tree has been created.
Index Root key Order
0 7 0
1 11 0
What do you wish like to do? create 4
Binomial tree has been created.
Index Root key Order
    0     7     0
    1     11    0
    2     4     0
What do you wish like to do? combine 0 1
Binomial trees have been combined.
Index Root key Order
    0     7     1
    1     4     0
What do you wish like to do? exit
Exit

コードの解説

  • まず、「binomial_tree」という名前のクラスを定義します。
  • コンストラクタでは、ノードのキー(key)、子ノードのリスト(children)、そして次数(order)を初期化します。
  • 「add_at_end」メソッドは、指定されたツリーを子として末尾に追加し、自身の次数を1つ増やします。
  • メイン処理では空のリスト「my_tree」を作成し、複数の二項ツリーを管理します。
  • ユーザーはメニューから操作を選択できます。「create」を指定するとキーの値を受け取り、新しい二項ツリーのインスタンスを生成してリストに追加します。
  • 各操作の後には、現在のツリーの一覧がインデックス・ルートのキー値・次数とともに表示されます。
  • 「combine」を選択した場合は、結合したい2つのツリーのインデックスを指定します。両者の次数が同じ場合のみ結合が行われ、一方のツリーが他方の子として追加され、リストから削除されます。
  • 次数が異なる場合は、結合には同じ次数が必要である旨のメッセージが表示されます。

なお、二項ツリーはヒープや優先度付きキューの実装で利用される重要なデータ構造です。同じ次数の二項ツリー同士を結合すると、次数が1つ大きい二項ツリーになるという性質があります。このサンプルコードはその基本原理をシンプルに体感できる内容となっています。

  1. Pythonでn分木(n-aryツリー)のコピーを作成する方法を解説

    n分木のコピーとは本記事では、ルートノード「root」が与えられたn分木(n-aryツリー)の完全なコピーを作成し、元の木とコピーした木の両方に対して先行順走査(preorder traversal)を実行する方法を解説します。作成したコピーは、別の新しいルートノードに格納する必要があります。使用するノードの構造は以下のとおりです。Node: value : <整数> children : <配列>入力例と出力例たとえば、次のようなn分木が与えられた場合を考えてみましょう。この場合、出力は次のようになります。[14, 27, 32, 42, 56, 65

  2. Pythonで式ツリー(式木)を構築する方法:後置記法の式から式木を作るプログラム

    式ツリー(Expression Tree)とは、二分木の一種で、葉ノードには演算の対象となる値(オペランド)が格納され、内部ノードには演算子が格納されるデータ構造です。 例:「4 + ((7 + 9) * 2)」という式は、次のような式ツリーで表現できます。 問題を解くためのアプローチ 与えられた式から式ツリーを構築する際には、一般的にスタックというデータ構造を使用します。まず、与えられた後置記法(ポストフィックス記法)の式を走査しながら、以下の手順を実行していきます。 式の中にオペランドが現れた場合は、それをノードとして作成し、スタックにプッシュします。 演算子が現れた場合は、その演算