バイナリツリーは、これは、バイナリツリーの基本的なスキルの一つであり、正常な動作を横断しています
クラスツリーノード(): 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)