思路:
1、由二叉樹的前(先)序序列和中序序列建立該二叉樹
分析:若二叉樹的任意兩個結點的值都不相同,則二叉樹的前序序列和中序序列能唯一確定一棵二叉樹。另外,由前序序列和中序序列的定義可知,前序序列中第一個結點必為根結點,而在中序序列中,根結點剛好是左、右子樹的分界點,因此,可按如下方法建立二叉樹:
1. 用前序序列的第一個結點作為根結點;
2. 在中序序列中查找根結點的位置,並以此為界將中序序列划分為左、右兩個序列(左、右子樹);
3. 根據左、右子樹的中序序列中的結點個數,將前序序列去掉根結點后的序列划分為左、右兩個序列,它們分別是左、右子樹的前序序列;
4. 對左、右子樹的前序序列和中序序列遞歸地實施同樣方法,直到所得左、右子樹為空。
例如:假設前序序列為ABDGHCEFI,中序序列為GDHBAECIF
解決:
def rebuild_tree(preorder, inorder): if len(preorder) == 0: return elif len(inorder) == 1: return TreeNode(inorder[0]) else: root = preorder[0] # 根據先序找到根節點 depth = inorder.index(root) # 找出當前節點在中序遍歷的位置,左側為左子樹,右側為右子樹 temp = TreeNode(root) # 前序遍歷中,去掉首節點,先序的左半邊為depth,右半邊為depth+1到末尾。之后遞歸調用rebuild_tree temp.left = rebuild_tree(preorder[1:depth+1], inorder[:depth]) temp.right = rebuild_tree(preorder[depth+1:], inorder[depth+1:]) return temp