データ構造 - 二分木(1)と同様に、プリアンブルシーケンスにおいて、トラバーサル(Python実装)後

前回の記事私たちは木の概念を導入し、今日我々は、特別な木を導入-バイナリツリーを、バイナリツリー非常に大規模な、多くの機能があります。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、その後、私たちはその後、私の記事に注意を払うように覚えて、より多くのバイナリ型とアプリケーションを紹介します。私たちについて私たちに伝えるためにメッセージを残して、あなたはそれを達成するための他の方法を持って、トラバーサルを前順。

おすすめ

転載: www.cnblogs.com/dongyangblog/p/11210820.html