您的位置:首页 > 其它

L2-011. 玩转二叉树

2016-06-05 13:01 423 查看



 


L2-011. 玩转二叉树

#include "iostream"
#include "queue"
#include "stdio.h"
using namespace std;
#define Max 51

int Pre[Max],Mid[Max],N;
struct Node
{
int Data;
Node *Left;
Node *Right;
Node ()
{
Left=NULL;
Right=NULL;
}
};
void CreatTree(int PreLeft,int MidLeft,int Len,Node *&p)
{
if(Len<=0)
{
return ;
}
p=new Node;
p->Data=Pre[PreLeft];
int len,i=MidLeft;
while(Pre[PreLeft]!=Mid[i])
i++;
len=i-MidLeft;
CreatTree(PreLeft+1,MidLeft,len,p->Left);
CreatTree(PreLeft+len+1,i+1,Len-len-1,p->Right);
}
void Output(Node *p)
{

cout<<p->Data;

queue<Node *> Q;
if(p->Left!=NULL)
{
Q.push(p->Left);
}
if(p->Right!=NULL)
{
Q.push(p->Right);
}

while(!Q.empty())
{
Node *s=Q.front();
Q.pop();
cout<<" "<<s->Data ;
if(s->Left!=NULL)
{
Q.push(s->Left);
}
if(s->Right!=NULL)
{
Q.push(s->Right);
}

}

}
void Swap(Node *p )
{
if(p==NULL) return;
Swap(p->Left);
Swap(p->Right);
Node *s;
s=p->Left;
p->Left=p->Right;
p->Right=s;
}

int main()
{

//freopen("1.txt","r",stdin);
cin>>N;
Node *Tree;
Tree=NULL;
int i,j;
for(i=1;i<=N;i++)
{
cin>>Mid[i];
}
for(j=1;j<=N;j++)
{
cin>>Pre[j];
}
CreatTree(1,1,N,Tree);
Swap(Tree);
Output(Tree);
cout<<endl;

return 0;
}


时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

陈越

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: