# 思路,根据先序遍历中,第一个数字为根,
# 根据根节点数字在中序遍历中找到其index,index左边的都是左子树,右边的都是右子树,记录左子树个数
# 先序遍历的第一个根,就是在后序遍历最后一个位置,根据算出的左子树个数,划分先序和后续数组的左右子树index
# 递归
def findorder(preorder, inorder):
presize = len(preorder)
res = [0] * presize
findordersub(preorder, 0, presize - 1, inorder, 0, presize - 1, res, 0, presize - 1)
return res
def findordersub(preorder, pl, pr, inorder, il, ir, res, rl, rr):
if pl > pr:
return
root = preorder[pl]
res[rr] = root
idx = 0
for idx in range(il, ir+1):
if inorder[idx] == root:
break
else:
idx += 1
leftcount = idx - il
# 注意每个数组的开始和结束index,可以写个例子对比
findordersub(preorder, pl + 1, pl + leftcount, inorder, il, idx - 1, res, rl, rl + leftcount - 1)
findordersub(preorder, pl + leftcount + 1, pr, inorder, idx + 1, ir, res, rl + leftcount, rr - 1)
print(findorder([6, 4, 2, 5, 3, 1, 7], [4, 2, 5, 6, 1, 3, 7]))