镜面反转:是指将所有非叶结点的左右孩子对换。
1.已知先序遍历,中序遍历,求层序遍历(这道题求层序的镜面反转,所以每一层从右向左遍历)
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 10110;
int pre[N],mid[N]; //前序遍历 中序遍历结果
int n,cnt;
queue<int> q;
struct Node {
int w;
int l,r;
}node[N];
void bulid(int l,int r,int pos) {
if(l>=r) {
node[pos].w = -1;
return;
}
int root = pre[cnt++];
node[pos].w = root;
node[pos].l = 2*pos;//左子结点
node[pos].r = 2*pos+1;//右子结点
int m = find(mid,mid+r,root)-mid; //algorithm中的find()函数,返回指针
bulid(l,m,2*pos);
bulid(m+1,r,2*pos+1);
}
void LevelPrint() {
q.push(1);
int pos;
while(!q.empty()) {
pos=q.front();
q.pop();
if(node[pos].w!=-1) {
if(pos!=1) cout<<" ";
cout<<node[pos].w;
q.push(node[pos].r);
q.push(node[pos].l);
}
}
cout << endl;
}
int main() {
cin >> n;
for(int i=0;i<N;i++)
node[i].w=-1; //每一个结点先初始化为叶子结点
for(int i=0;i<n;i++)
cin >> mid[i];
for(int i=0;i<n;i++)
cin >> pre[i];
bulid(0,n,1);
LevelPrint();
return 0;
}
2.已知后序遍历和中序遍历,输出其层序遍历的序列。
#include<iostream>
#include<queue>
using namespace std;
int tree[10010],level[10010]; //tree:二叉树 level:记录层序遍历
int sum;
int lvr[31],lrv[31];
//构建二叉树
void CreateTree(int *lrv,int *lvr,int n,int index) {
if(n==0)
return;
int k=0;
while(lrv[n-1]!=lvr[k]) k++;
tree[index] = lvr[k];
CreateTree(lrv,lvr,k,index*2);
CreateTree(lrv+k,lvr+k+1,n-k-1,index*2+1);
}
//层序遍历
void LevelPrint() {
queue<int> q;
q.push(1);
int p;
while(!q.empty()) {
p = q.front();
q.pop();
level[sum++] = tree[p];
if(tree[p*2]!=0) q.push(p*2);
if(tree[p*2+1]!=0) q.push(p*2+1);
}
}
int main() {
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> lrv[i];
for(int i=0;i<n;i++)
cin >> lvr[i];
CreateTree(lrv,lvr,n,1);
LevelPrint();
for(int i=0;i<sum;i++) {
if(i==sum-1)
cout<<level[i]<<endl;
else
cout<<level[i]<<" ";
}
return 0;
}
来源:CSDN
作者:在路上Ven
链接:https://blog.csdn.net/Ven21959/article/details/104280076