用前序和中序重建二叉樹 python


程序實現了用二叉樹的前序遍歷序列和中序遍歷序列重建二叉樹,代碼用python實現。

首先定義二叉樹節點的類:

1 class TreeNode: 2     def __init__(self, x): 3         self.val = x 4         self.left = None 5         self.right = None

       二叉樹的前序遍歷順序為:根-左-右,中序遍歷順序為:左-根-右,因此可以根據前序序列准確地找到根節點,找到根節點之后,可以在中序序列中根據根節點的位置,區分出左右子樹的集合,分別列出左右子樹的前序序列和中序序列,然后重復這些操作,直到找到葉子結點,整個過程如下圖所示。重建是相同的操作在不同的子樹上重復執行的過程,因此代碼利用遞歸完成。

1 class Solution: 2     def reConstructBinaryTree(self, pre, tin):#pre、tin分別是前序序列和中序序列
3         # write code here
4         if len(pre)>0: 5             root=TreeNode(pre[0])#前序序列的第一個肯定是當前子樹的根節點
6             rootid=tin.index(root.val)#通過根節點在中序序列中的位置划分出左右子樹包含的節點
7             root.left=self.reConstructBinaryTree(pre[1:1+rootid],tin[:rootid])#重建左子樹
8             root.right=self.reConstructBinaryTree(pre[1+rootid:],tin[rootid+1:])#重建右子樹
9             return root

      可以采用層序輸出的方式驗證生成的二叉樹是否正確,用先進先出的隊列依次保存層序遍歷到的節點(該方法在類Solution下),然后遍歷每個節點的左子節點和右子節點,代碼實現如下

def PrintFromTopToBottom(self, root): ans=[] if root==None: return ans else: q=[root] while q: node=q.pop(0) ans.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) return ans

python版本:3.6

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM