class TreeNode:
def __init__(self,data,left,right):
self.data=data
self.left=left
self.right=right
方法1
def construct_tree(pre_order,mid_order):
##保证结点数不为0,该树才能重构
if (len(pre_order)==0) or (len(mid_order)==0):
return None
##根节点即为前序遍历的首元素
root_data=pre_order[0]# make sure the root_Data
##若结点个数为1,则不含左右子书
if len(pre_order)==1 :
return TreeNode(root_data,None,None)
##在中序遍历中查找根节点,确定其下标
for i in range(len(mid_order)):
if root_data==mid_order[i]:
break
root_mid_index=i
#if root_mid_index >0:
##分别重构其左右子书
left=construct_tree(pre_order[1:root_mid_index+1],mid_order[:root_mid_index])
if root_mid_index<len(mid_order):
right=construct_tree(pre_order[root_mid_index+1:],mid_order[root_mid_index+1:])
return TreeNode(root_data,left,right)
if __name__=='__main__':
pre_order = [1, 2, 4, 7, 3, 5, 6, 8]
mid_order = [4, 7, 2, 1, 5, 3, 8, 6]
root=construct_tree(pre_order,mid_order)
方法2
#def reConstructBinaryTree(pre, tin):
# # write code here
# if (len(pre) == 0) or (len(tin) == 0):
# return None
#
# rootValue = pre[0]
# root = TreeNode(rootValue,None,None)
# if len(pre)==1:
# return root
# rootTinIndex = 0
# for i in range(len(tin)):
# if tin[i] == rootValue:
# rootTinIndex = i
# preStart = 1
# preEnd = rootTinIndex+1
# tinStart = 0
# tinEnd = rootTinIndex
# if rootTinIndex > 0:
##用递归函数返回的结果赋值给某个变量 该变量之前必须定义过初值,如root.left/right==None
# root.left = reConstructBinaryTree(pre[preStart:preEnd], tin[tinStart:tinEnd])
# if rootTinIndex < len(pre):
# root.right = reConstructBinaryTree(pre[preEnd:], tin[tinEnd+1:])
# return root
#if __name__=='__main__':
# pre = [1, 2, 4, 7, 3, 5, 6, 8]
# tin = [4, 7, 2, 1, 5, 3, 8, 6]
# root=reConstructBinaryTree(pre,tin)
print root.data
print root.left.data,root.right.data
print root.left.left.data,root.right.left.data,root.right.right.data
print root.left.left.right.data,root.right.right.left.data