void f(int idxroot){ //根据前序遍历和中序遍历还原二叉树
if(idxroot==n+1) return;
int root=pre[idxroot];
bool check=true;
map<int,int> lcmp,rcmp; //当前节点的左孩子集合和右孩子集合
for(int i=1;i<=n;i++){
if(vis[mid[i]]&&mid[i]!=root&&!check) break; //key!
if(mid[i]==root){
check=false;
continue;
}
if(check&&!vis[mid[i]]) lcmp[mid[i]]=1;
else if(!check&&!vis[mid[i]]) rcmp[mid[i]]=1;
}
for(int i=1;i<=n;i++){ //在前序遍历中遇到的第一个左孩子集合中的点,就是root的左孩子;右孩子同理
if(lcmp[pre[i]]&&vct[root].lc==0){
vct[root].lc=pre[i];
vis[pre[i]]=1;
}
else if(rcmp[pre[i]]&&vct[root].rc==0){
vct[root].rc=pre[i];
vis[pre[i]]=1;
break;
}
}
f(idxroot+1);
}
这个是自己在写题:7-12 玩转二叉树 - SMU 2024 spring 天梯赛4(补题) (pintia.cn)的时候,研究出来的。题是通过了(可能数据不强),不知道这个代码是不是百分百没问题。
标签:遍历,idxroot,int,中序,二叉树,前序 From: https://www.cnblogs.com/ouhq/p/18146991