已知先序和中序求后序
假设先序序列为pre[],中序序列为in[],pre左端索引为preL,右端索引为preR,in左端索引为inL,右端索引为inR,先序遍历先访问根结点,中序遍历先访问左子树,再访问根结点,遍历in数组,找到与pre[preL]相等的位置tmp,此节点左边节点为左子树,右边节点为右子树,所以左子树节点数目为numLeft = tmp - inL,右子树节点数目为numRight = inR - tmp,左子树索引先序序列范围为[preL + 1, preL + numLeft],右子树先序序列索引范围为[pre + numLeft + 1, preR],左子树中序序列索引范围为[inL, inL + numLeft - 1], 右子树中序序列索引范围为[tmp + 1, inR]。通过递归遍历子树模拟后序遍历。
void post(int preL, int preR, int inL, int inR)
{
if(inL > inR) return; //到达叶子节点
int index = inL;
int root = pre[preL]; //当前子树根结点
while (in[index] != pre[preL]) //寻找中序序列中根结点位置
{
index++;
}
int tmp = index - inL;
post(preL + 1, preL + tmp, inL, index - 1); //访问左子树
post(preL + tmp + 1, preR, index + 1, inR); //访问右子树
cout << root << endl; //输出根结点
}