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