Pythonでバイナリツリーを実装する方法

スポンサーリンク

この記事では、バイナリツリーとは何か、そしてバイナリツリーデータ構造の背後にある基本的な概念について学びます。

また、Pythonのクラスを使ってバイナリツリーを実装します。

スポンサーリンク

バイナリーツリーとは

バイナリツリーとは、親オブジェクトが存在し、各オブジェクトが0個、1個、または2個の子を持つことができるデータ構造です。

一般にオブジェクトをノードと呼び、各ノードはデータフィールド、左の子への参照、右の子への参照で構成されます。

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild=None

上の構造からわかるように、ノードはそれ自身のデータを持ち、また、左側と右側の2つのノードへの参照を持つことになる。

この構造を実装するには、クラスを定義し、データに値を割り当て、左の子と右の子への参照を割り当てればよい。

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild = None
     
a1=BinaryTreeNode(10)
a2=BinaryTreeNode(15)
a3=BinaryTreeNode(20)
a4=BinaryTreeNode(60)
a5=BinaryTreeNode(14)
a6=BinaryTreeNode(25)
a7=BinaryTreeNode(6)
 
a1.leftChild=a2
a1.rightChild=a3
a2.leftChild=a4
a2.rightChild=a5
a3.leftChild=a6
a3.rightChild=a7
 
print("Root Node is:")
print(a1.data)
 
print("left child of node is:")
print(a1.leftChild.data)
 
print("right child of node is:")
print(a1.rightChild.data)
 
print("Node is:")
print(a2.data)
 
print("left child of node is:")
print(a2.leftChild.data)
 
print("right child of node is:")
print(a2.rightChild.data)
 
print("Node is:")
print(a3.data)
 
print("left child of node is:")
print(a3.leftChild.data)
 
print("right child of node is:")
print(a3.rightChild.data)
 
print("Node is:")
print(a4.data)
 
print("left child of node is:")
print(a4.leftChild)
 
print("right child of node is:")
print(a4.rightChild)
 
print("Node is:")
print(a5.data)
 
print("left child of node is:")
print(a5.leftChild)
 
print("right child of node is:")
print(a5.rightChild)
 
print("Node is:")
print(a6.data)
 
print("left child of node is:")
print(a6.leftChild)
 
print("right child of node is:")
print(a6.rightChild)
 
print("Node is:")
print(a7.data)
 
print("left child of node is:")
print(a7.leftChild)
 
print("right child of node is:")
print(a7.rightChild)

ここでは、コンストラクタはデータの値を入力として受け取り、 BinaryTreeNode 型のオブジェクトを生成し、与えられた入力と等しいデータフィールドを初期化し、左の子と右の子の参照を None に初期化します。

二分木の基本的な専門用語

それでは、二分木を例にとって、それに関連する用語を見てみましょう。

次のような二分木が与えられたとします。

Root Node is:
10
left child of node is:
15
right child of node is:
20
Node is:
15
left child of node is:
60
right child of node is:
14
Node is:
20
left child of node is:
25
right child of node is:
6
Node is:
60
left child of node is:
None
right child of node is:
None
Node is:
14
left child of node is:
None
right child of node is:
None
Node is:
25
left child of node is:
None
right child of node is:
None
Node is:
6
left child of node is:
None
right child of node is:
None
  • ルートノード。2分木の最上位ノードをルート・ノードと呼ぶ。木が作られるときに最初に作られるノードです。上記の例では、10がルートノードです。
  • 親ノード。親ノード:ノードの親は、leftChild 参照または rightChild 参照が現在のノードを指しているノードであ る。例えば、10は15の親ノードです。
  • 子ノード。子ノード:親ノードが指しているノードを子ノードと呼ぶ。子ノード:親ノードが指しているノードを子ノードと呼ぶ。
  • エッジ: エッジは、ツリー内の任意の 2 つのノードを接続するリンクです。
  • 内部ノード。内部ノード:内部ノードは、少なくとも 1 つの子ノードを持つノードです。この例では、データ10,15,20を含むノードが内部ノードです。
  • リーフノードまたは外部ノード。バイナリツリーのノードで、子ノードを持たない。leftChildとrightChildはともにNoneを参照します。上の例では、データ 60, 14, 25, 6 を持つノードが、リーフノードまたは外部ノードです。

Pythonでバイナリツリーを実装する

では、上記の例で示された二分木を以下のコードで実装してみましょう。

Askpython11
Depiction of structure of a node in a binary tree

結果は以下の通りです。

Askpython21
Depiction of a Binary Tree

上記のコードでは、まず例で定義した BinaryTreeNode クラスのオブジェクトを生成しています。

次に、ツリーのルートを指定し、ルート・ノードに子ノードを追加し、さらにそれを繰り返す。

そして、各ノードのデータとその子ノードのデータを出力しています。

まとめ

この記事では、バイナリツリーの背後にある理論的な概念を見て、次にその概念に基づいてバイナリツリーを実装しました。

今後も有益なチュートリアルをお届けします。

それでは、よいお年を

タイトルとURLをコピーしました