给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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<iostream>
using namespace std;
int inOrder[31],preOrder[31];
int n;
class Binode
{
public:
int data;
Binode *lchild;
Binode *rchild;
};
class Bitree
{
public:
Binode *root;
void built(Binode *&root,int l_in,int r_in,int l_pre,int r_pre);
void reserveTree(Binode *&root);
void levelOrder(int n);
};
void Bitree::built(Binode *&root,int l_in,int r_in,int l_pre,int r_pre)
{
if(l_in>r_in)
{
root=NULL;
return;
}
int p1,p2;
p1=l_in;
while(inOrder[p1]!=preOrder[l_pre])
p1++;
p2=p1-l_in;//左子树节点的总数
root=new Binode;
root->data=preOrder[l_pre];
built(root->lchild,l_in,p1-1,l_pre+1,l_pre+p2);
built(root->rchild,p1+1,r_in,l_pre+p2+1,r_pre);
}
//镜面反转
void Bitree::reserveTree(Binode *&root)
{
if(!root)
return;
Binode *temp;
if(root->lchild||root->rchild)
{
temp=root->lchild;
root->lchild=root->rchild;
root->rchild=temp;
}
reserveTree(root->lchild);
reserveTree(root->rchild);
}
void Bitree::levelOrder(int n)
{
Binode *queue[n+2];
int head=1;
int tail=1;
Binode *p;
p=this->root;
queue[tail]=p;
tail++;
while(head<tail)
{
p=queue[head++];
n--;
if(n!=0)
cout<<p->data<<" ";
else
cout<<p->data<<endl;
if(p->lchild)
{
queue[tail]=p->lchild;
tail++;
}
if(p->rchild)
{
queue[tail]=p->rchild;
tail++;
}
}
}
int main()
{
cin>>n;
int i;
for(i=1;i<=n;i++)
cin>>inOrder[i];
for(i=1;i<=n;i++)
cin>>preOrder[i];
Bitree tree;
tree.built(tree.root,1,n,1,n);
tree.reserveTree(tree.root);
tree.levelOrder(n);
}