【基本思路】
根据当前的先序和中序数组,设置后序数组最右边的值,然后划分出左子树的先序、中序数组,以及右子树的先序、中序数组,先根据右子树的划分设置好后序数组,再根据左子树的划分,从右边到左边依次设置好后序数组的全部位置
下面是使用python3.5实现的代码
#python3.5
#通过先序和中序数组生成后序数组
def preInToPos(pre, mid):
def preInPos(pre, pi, pj, mid, mi, mj, pos, sj, map):
if pi > pj:
return sj
pos[sj] = pre[pi]
sj -= 1
index = map.get(pre[pi])
sj = preInPos(pre, pi+index-mi+1, pj, mid, index+1, mj, pos, sj, map)
return preInPos(pre, pi+1, pi+index-mi, mid, mi, index-1, pos, sj, map)
if pre == None or mid == None:
return []
pos = [None for i in range(len(mid))]
map = {}
for i in range(len(mid)):
map[mid[i]] = i
preInPos(pre, 0, len(pre)-1, mid, 0, len(mid)-1, pos, len(mid)-1, map)
return pos