讨论的内容如题
分析
拿中序遍历和后序遍历的组合举例子
设数组last[]储存后续遍历 in[]中序遍历,它们的长度都是n(数组从1开始计,下标范围是1-n)
树根自然为last[n] ,这时我们遍历in[]数组,在in[]数组中找到last[n]的值的下标idx,因为in[]储存的是中序遍历,显然我们以idx为界把in数组的序列分成两份[1,idx-1],[idx+1,n],分别为两颗子树上的节点。
之后我们便可以在分出的两个区间之中重复上述操作,分别找目前子树的根节点,再二分区间,直到获得完整的二叉树
可以使用递归来完成 函数(区间左,区间右,根节点,偏移量)
此时注意一个问题:当区间被二分之后,我们发现后面的区间在in[]数组和last[]数组中的下标“对不齐”了,即下标发生了偏移,如下图。所以要引入一个变量shift来记录偏移量。(偏移量最开始是0,递归时前面的区间继承原偏移量,后面的区间偏移量为原偏移量+1)
(在前序遍历和中序遍历的组合中,下标发生偏移的是前面的区间)
例题 后序遍历和中序遍历的组合
https://vjudge.net/contest/386054#problem/E
#include <iostream>
#include <cstring>
#include <cstdio>
struct Node
{
int l,r;
};
Node treeN[10010];
int inorder[10010],postorder[10010];
int len,rt,least,lstPos;
int input()//返回数组长度
{
int n,idx=1;
char ch;
while(scanf("%d",&n)!=EOF)
{
inorder[idx++]=n;
ch=getchar();
if(ch=='\n')
break;
}
idx=1;
while(scanf("%d",&n)!=EOF)
{
postorder[idx++]=n;
ch=getchar();
if(ch=='\n')
break;
}
return idx-1;
}
int makeTree(int l,int r,int root,int n)
{