pythonのバイナリツリートラバーサルを達成し、構築します

コーディング= UTF-8 


クラスノード(オブジェクト):
     デフ __init__(自己、データ=なし、left_child =なし、right_child = なし):
        self.data = データ
        self.left_child = left_child 
        self.right_child = right_child 


クラスB木(オブジェクト) :

    DEF  __init__ (自己):
        self.root = なし

    デフadd_node(自己、データ):
        ノード = ノード(データ)
         場合 self.rootがあるなし:
            self.root =ノード
             戻り
        tmp_queue = [self.root]
         一方TRUE:
            前記current_node = tmp_queue.pop(0)の
             場合は前記current_nodeがあるなし:
                 リターン
            場合 current_node.left_childはしないなし:
                current_node.left_child = ノード
                 戻り
            ELIFの current_node.right_childがあるなし:
                current_node.right_child = ノード
                 リターン
            tmp_queue.append(current_node.left_child)
            tmp_queue.append(current_node.right_child)

    デフfront_travel(自己、ノード):
         "" " 先序遍历""" 
        場合は、ノードがあるが、なし:
             リターン・
        プリント(node.data)
        self.front_travel(ノード.left_child)
        self.front_travel(node.right_child)

    デフmiddle_travel(自ノード):
         "" " 中序遍历""" 
        場合にノードがあるなし:
             戻り
        self.middle_travel(node.left_child)
        印刷(node.data)を
        self.middle_travel(node.right_child)

    デフlast_travel(自己、ノード):
         "" " 后序遍历""" 
        場合は、ノードがありませんなし:
             リターン
        self.last_travel(node.left_child)
        self.last_travel(node.right_child)
        プリント(node.data)

    デフlevel_travel(自己) :
         "" " 层次遍历""" 
        tmp_queue = [self.root]
         しばらく真:
             場合 lenは(tmp_queue)== 0:
                 印刷" 旅の終わり" =返す
            current_nodeのtmp_queue.pop(0)
             印刷(current_node.data)
             場合current_node.left_child:
                tmp_queue.append(current_node.left_child)
            場合current_node.right_child:
                tmp_queue.append(current_node.right_child)

    DEF 正面(自己
        ):""」堆栈前序遍历""」
        なら ないself.root:
             戻り
        tmp_stack = [] 
        ノード = self.root
         一方 tmp_stack またはノード:
             一方のノード:
                 印刷(node.data)
                tmp_stack.append(ノード)
                ノード = node.left_child 
            ノード = tmp_stack.pop()
            ノード = node.right_child 

    DEF 中央(自己):
         "" " 堆栈中序遍历""" 
        なら ないself.root。
             戻り
        tmp_stack = [] 
        ノード = self.root
         ながら tmp_stack またはノード:
             つつ:ノード 
                tmp_stack.append(ノード)
                ノード = node.left_child
            ノード = tmp_stack.pop()
             プリント(node.data)
            ノード = node.right_child 

    デフ最後の(自己):
         "" " 堆栈后序遍历、较难""" 
        もし ないself.root:
             リターン
        tmp_node = self.root 
        tmp_stack = []
         一方 tmp_node 又はtmp_stack:
             しばらくtmp_node:
                tmp_stack.append(tmp_node)
                tmp_node = tmp_node.left_child 又はtmp_node.right_child
            tmp_node = tmp_stack.pop()
             プリント(tmp_node.data)
             場合 tmp_stack  tmp_stack [-1] .left_childがあるtmp_node:
                tmp_node = tmp_stack [-1 ] .right_child
             
                tmp_node = なし


の場合 __name__ == " __main__ "  = B木()
     のための I における範囲(1、20 ):
        tree.add_node(I) 

    tree.level_travel()#广度遍历
    再帰的な先行順走査#の前にTree.front_travel(tree.root) 
    tree.middle_travel(tree.root)#再帰的な先行順 
    tree.last_travel(tree.root)  再帰的な先行順走査の後に
    印刷" --- " * 20 フロントtree.front()#スタック先行順
    #1 tree.middle()#スタックプレオーダー 
    tree.last()   #1 スタッカーは先行予約であります

 

 要約:

  オンラインリファレンス他のブログを見て何バイナリツリー構築とトラバーサル、総括し、いくつかのブログは非常によく書かれているが、より多くのブログのアルゴリズムや冗長、またはコードの品質は、非常に読み面倒高くないので、彼は再書き込み再び。理解することは少し難しいスタック順トラバーサル少しトラブル、その後、提案されたマップは、紙に描かれた外観を。

おすすめ

転載: www.cnblogs.com/qiaokuahai/p/11566948.html