程序實現了用二叉樹的前序遍歷序列和中序遍歷序列重建二叉樹,代碼用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