バイナリツリーの再帰と非再帰的トラバーサルを作成します。

バイナリツリーは、これは、バイナリツリーの基本的なスキルの一つであり、正常な動作を横断しています

クラスツリーノード():
     DEF  __init__ (セルフ、X):
        self.val = X 
        self.left = なし
        self.right = なし

クラスBinaryTree(オブジェクト):
     DEF  __init__ (セルフ、事前にTiN):
        self.pre = あらかじめ
        セルフ.tin = TiNの
        self.levelTrave = [] 階層トラバーサル結果 
        self.preTraveRecur = [] プリアンブル再帰トラバーサル結果 
        self.preTraveNoRecur = [] プリアンブル非再帰的トラバーサル結果 
        self.inTraveRecur = [] 次再帰トラバーサル結果に 
        self.inTraveNoRecur = [] オーダー非再帰トラバーサル結果に 
        self.postTraveRecur = [] 後順再帰トラバーサル結果 
        self.postTraveNoRecur = [] 後順の非再帰トラバーサル結果を

    プレオーダートラバーサル使用前及び結果は、バイナリツリートラバーサル順序再構築
    DEF:reConstructBinaryTree(セルフ、予め、錫)#の前順走査、錫先行順結果の予備結果を
        IF(PRE)== lenのない0:
             戻りなし
         IF。lenは(事前)== 1 リターンツリーノード([0] PRE)
         
            RES = ツリーノード(プレ[0])
            res.leftSelf.reConstructBinaryTree =(PRE [1:tin.index(PRE [0])+ 1 ]、TiNの[:tin.index(予備[0])])
            res.right = self.reConstructBinaryTree(予備[tin.index( [0])+を予め1:]のTiN [tin.index([0プレ])+ 1。:])
         を返すRES 

    トラバースレベル
    DEF levelTraversal(セルフ、PROOT):
        AUX = []
         IF PROOT =なし:! 非空のルートノードがリストに追加されたAUX 
            AUX = [PROOT] 

        ながら lenは(AUX): 要素が訪問を続け、または端横切るように存在する場合、AUXリストの要素が存在するかどうかを判断する 
            (0)、P = aux.popをシミュレーションは、リストの最初の要素取るたびにキューイング
            self.levelTrave.append(p.valを)
            IF p.left =なし:! 現在の要素は、リストのAUX端参加する最初のノードを残している場合
                aux.append(p.left)
             IF p.right =なし:! #は現在のノードの最初の要素はAUX参加する権利を持っている場合をリストの末尾
                aux.append(p.right)

    プリオーダー再帰トラバーサル
    DEF :preorderTraversalRecursion(自己、PROOT)
         IF PROOT == なし:
             リターン
        self.preTraveRecur.append(pRoot.val) # 
        IF pRoot.left =!なし:
            self.preorderTraversalRecursion(pRoot.left)
        IF pRoot.right =!なし:
            self.preorderTraversalRecursion(pRoot.right)

    プリアンブル非再帰トラバーサル
    DEF preorderTraversalNoRecursion(自己、PROOT):
         IF PROOT == なし:
             戻り
        AUX = [] 
        ノード = PROOTし
         ながらノードまたはAUXは:
             ながらノード:
                 #は、ルートから開始し、その左の部分木を探している
                自己.preTraveNoRecur.append(node.val)
                aux.append(ノード)
                ノード = node.left
                 一方、エンド・ノードは、ツリーノードの前のない左の子がないこと、現在のノードが空であることを示し、 
            ノード= aux.pop()
             それは右のサブツリーを見て開始 
            ノード= node.right 

    #を順番に再帰トラバーサル
    DEF inorderTraversalRecursion(セルフ、PROOT):
         IF PROOT == なし:
             リターン
        IF!PRoot.left = :なし
            self.inorderTraversalRecursion(pRoot.left)
        セルフ。 inTraveRecur.append(pRoot.val) # 
        IF pRoot.right =!なし:
            self.inorderTraversalRecursion(pRoot.right) 

    受注非再帰的トラバーサルで
    DEF inorderTraversalNoRecursion(セルフ、PROOT):
         IFルート== :なし
             戻り値
        AUX = [] 
        ノード = ルート
         つつノードまたはAUX:
             一方のノード:
                 #は  、ルートから開始して、左サブツリーで発見された
                aux.append(ノード)
                ノード = node.left
             エンドノードが現在のノードが、空であることを示しながら、そのA前ノードには、左サブツリー持たない 
            ノードを= aux.pop()
            self.inTraveNoRecur.append(node.val)
            ノード = node.right 

    後順トラバーサル再帰
    DEF postorderTraversalRecursion(セルフ、PROOT):
         IF PROOT ==なし:
             リターン
        もし!pRoot.left = なし:
            self.postorderTraversalRecursion(pRoot.left)
        の場合 pRoot.right =!なし:
            self.postorderTraversalRecursion(pRoot.right)
        self.postTraveRecur.append(pRoot.val) !!!! !

    后序非递归遍历
    DEF postorderTraversalNoRecursion(自己、PROOT):
         もしルート== なし:
             リターン
        AUX = [] 
        ノード = ルート
         つつノードまたはAUX:
             しばらくノード:
                 ルートから開始して、その右サブツリーを探している
                self.postTraveNoRecur.insert(0、node.val)
                aux.append(ノード)
                ノード = node.right
             エンドノードが現在のノードが、空であることを示す前に、その右の子ノードがAではない 
            ノード= aux.pop()は
             その左サブツリーに探し始める 
            ノード= node.left 

IF  __name__ == __main__ プリアンブルを使用して再構成されたバイナリ先行順 
    予め= [1、 2 ,. 4 ,. 7 ,. 3 ,. 5 ,. 6 ,. 8 ] 
    のTiN = [4 ,. 7,2 ,. 1 ,. 5 ,. 3 ,. 8 ,. 6 ] 
    BT =BinaryTree(プリ、TiN)から
    ルート = BT.reConstructBinaryTree(BT.pre、BT.tin) 

    トラバースレベル
    BT.levelTraversal(ルート)
     プリント" 結果スルーレベル:" 、BT.levelTrave)

    #1 次再帰トラバーサル
    BT.preorderTraversalRecursion (ルート)
     を印刷プリオーダー再帰トラバーサル:、BT.preTraveRecur) 

    前の順序の非再帰的トラバーサル
    BT.preorderTraversalNoRecursion(ルート)
     を印刷プリアンブル非再帰的トラバーサル:、BT.preTraveNoRecur) 

    再帰的トラバーサル順序で
    BT .inorderTraversalRecursion(ルート)
     を印刷"次再帰トラバーサルには:「BT.inTraveRecur) 

    受注非再帰的トラバーサルで
    BT.inorderTraversalNoRecursion(ルート)
     を印刷非再帰的トラバーサル順序、BT.inTraveNoRecur) 

    後順再帰的トラバーサル
    BT.postorderTraversalRecursion(ルート)
     を印刷後順トラバーサル再帰、BT.postTraveRecur) 

    後の順序非再帰的トラバーサル
    BT.postorderTraversalNoRecursion(ルート)
     を印刷後順トラバーサル非再帰的、BT.postTraveNoRecur)

 

おすすめ

転載: www.cnblogs.com/shnuxiaoan/p/12241694.html