给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template <class DataType>
struct BiNode
{
DataType data;
BiNode<DataType> *lchild, *rchild;
BiNode(DataType n){
data=n;
lchild=NULL;
rchild=NULL;
}
};
template <class DataType>
class BiTree
{
public:
BiTree()
{
int n,i;
cin>>n;
int *q,*z;
q=new int[n];
z=new int[n];
for(i=0; i<n; i++)
{
cin>>q[i];
}
for(i=0; i<n; i++)
{
cin>>z[i];
}
root = Creat(z,q,n);
}
void LeverOrder(); //层序遍历二叉树
private:
BiNode<DataType> *Creat(DataType *z,DataType *q,int n); //构造函数调用
BiNode<DataType> *root; //指向根结点的头指针
};
template <class DataType>
BiNode<DataType> *BiTree<DataType> ::Creat(DataType *q,DataType *z,int n){
if(n==0)
return NULL;
int k=0;
while(q[0]!=z[k]){
k++;
}
BiNode<DataType> *t=new BiNode<DataType>(q[0]);
t->lchild=Creat(q+1,z,k);
t->rchild=Creat(q+k+1,z+k+1,n-k-1);
return t;
}
int c=0;
template <class DataType>
void BiTree<DataType> :: LeverOrder( )
{
BiNode<DataType> *Q[100], *q = nullptr; //顺序队列最多100个结点
int front = -1, rear = -1; //队列初始化
if (root == nullptr) return; //二叉树为空,算法结束
Q[++rear] = root; //根指针入队
while (front != rear) //当队列非空时
{
q = Q[++front];
if(c==0){
cout << q->data;
c=1;
}else{
cout <<" "<< q->data;
}
if (q->rchild != nullptr) Q[++rear] = q->rchild;
if (q->lchild != nullptr) Q[++rear] = q->lchild;
}
}
int main( )
{
BiTree<int> asd;
asd.LeverOrder();
return 0;
}
把输出时遍历左右孩子的顺序交换就行
不单独写镜面翻转的函数了