前回の記事私たちは木の概念を導入し、今日我々は、特別な木を導入-バイナリツリーを、バイナリツリー非常に大規模な、多くの機能があります。1月我々は皆のために今日を導入します。
二進木
名前が示すように、バイナリツリーは、ツリーの2つのノードだけで、2つのノードはそれを右または複数のノードを区別する必要がある唯一の子が残っている場合でも、上の特別な重点を置いて、左のノードと右のノードです。
一般的なバイナリツリーは二分木、完全二分木、完全なバイナリツリー、バイナリツリー歩道、ハフマン木、バイナリソートツリー、平衡二分木、赤黒ツリー、Bツリー非常に多くの種類は、一般的に存在します。私たちは、この記事では簡単な一般的なバイナリツリーは、バイナリツリーを完了し、バイナリツリーがいっぱいです。
一般的なバイナリツリー
非常に単純な限り、木のノーつ以上の子ノードとしてバイナリツリーです。長い道のり:
完全なバイナリツリー
ノードの最後の層に加えて、バイナリツリーの一般的な要件に基づいて完全なバイナリツリーは、各ノードは2つのつの子ノードを持っている必要があります。
完全二叉树
必要とする第1層から第2層への完全なバイナリツリーは、ノードが左から右に配置された最後の層を満たすために、完全なバイナリツリーの逆数で構成されています。
まあ、バイナリツリーの概念に関しては、我々はのは、トラバースした後、順番に、プリアンブルバイナリツリーをご紹介しましょう、ここで紹介します。
それまでは、のは、バイナリツリーを作成してみましょう:
class BinaryTree:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def get(self):
return self.data
def getLeft(self):
return self.left
def getRight(self):
return self.right
def setLeft(self, node):
self.left = node
def setRight(self, node):
self.right = node
さて、ここでは、バイナリツリーのクラスの良い定義を持って、そしてそれに少し道を追加し、我々は、バイナリツリーをインスタンス化します。
binaryTree = BinaryTree(0)
binaryTree.setLeft(BinaryTree(1))
binaryTree.setRight(BinaryTree(2))
binaryTree.getLeft().setLeft(BinaryTree(3))
binaryTree.getLeft().setRight(BinaryTree(4))
binaryTree.getRight().setLeft(BinaryTree(5))
binaryTree.getRight().setRight(BinaryTree(6))
バイナリツリーの例としては、このような良い長い見ています:
先行順走査
次に、我々は、このツリーの先行順走査を行いました。これに先立ち、我々は先行順走査であるかを説明します。
以前の私たちは、ここではそれらを繰り返さないで、木の深さ優先探索と幅優先トラバーサルを導入しました。
ツリーのトラバーサルの順序の先行順走査は、最初の親ノードであり、次にようにツリーを横断するために、ツリーの左ノードと右のノードを横断し、そして。
> 1 - - > 3 - > 4 - > 2 - > 5 - > 6 0:我々のバイナリのためだけでなく、上記の先行順走査結果を定義
プリアンブルのために、順番に、トラバースした後、再帰的なアプローチは非常に便利です。ここでは、これを達成するために再帰を使用します。
def preorderTraversal(now, result=[]):
if now == None:
return result
result.append(now.data)
preorderTraversal(now.left, result)
preorderTraversal(now.right, result)
return result
print(preorderTraversal(binaryTree))
結果:[0, 1, 3, 4, 2, 5, 6]
、と私たちは手動で前と同じを横断した結果ではありません。
予約限定!
INORDERトラバーサル順序は、最初のツリートラバーサルの左ノード、ツリーの親ノードを横切る、右ノード、ツリーをトラバース。
弊社のバイナリツリーは上記で作成したために、それは先行順結果:3 - > 1 - > 4 - > 0 - > 5 - > 2 - > 6
プリオーダーは、親ノードを横断するときに、横断するresult.append(now.data)
前部左ノードと右のノードを横断中に、。
左側の最初のノードの前順走査は、それがresult.append(now.data)
後部左ノードトラバーサル、フロント右ノードのトラバースに必要です。
def intermediateTraversal(now, result=[]):
if now == None:
return result
intermediateTraversal(now.left, result)
result.append(now.data)
intermediateTraversal(now.right, result)
return result
print(intermediateTraversal(binaryTree))
結果:[3, 1, 4, 0, 5, 2, 6]
後順
後順の順序:最初のツリートラバーサルの左ノードは、次に、ツリーの右ノード、ツリートラバーサルの、親ノードを横断します。
我々のバイナリツリーは上記で作成したため、これ後順トラバース結果:3 - > 0 - > 4 - > 1 - > 5 - > 6 - > 2
再帰式を対応する次のとおりです。
def postorderTraversal(now, result=[]):
if now == None:
return
postorderTraversal(now.left, result)
postorderTraversal(now.right, result)
result.append(now.data)
return result
print(postorderTraversal(binaryTree))
結果:[3, 4, 1, 5, 6, 2, 0]
さて、今日はここで説明するバイナリツリートラバーサルシーケンス上の私たちの3、その後、私たちはその後、私の記事に注意を払うように覚えて、より多くのバイナリ型とアプリケーションを紹介します。私たちについて私たちに伝えるためにメッセージを残して、あなたはそれを達成するための他の方法を持って、トラバーサルを前順。