您的位置:首页 > 其它

L2-011 玩转二叉树

2017-07-11 17:31 381 查看

L2-011. 玩转二叉树

时间限制
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

#include<iostream>
using namespace std;
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<deque>
typedef struct Tree{//定义二叉树结构
char c;
int x;
Tree *left;
Tree *right;
}Tree,*BiTree;

deque<BiTree> s;//层序遍历二叉树所用的队列
int pre[31],mid[31];
int a[31];

BiTree createTree(BiTree T){// 按照先序遍历创建二叉树
char ch;
T=(BiTree)malloc(sizeof(Tree));
if(!T){
exit(0);
}
ch=getchar();
if(ch=='0'){
T=NULL;
}
else{
T->c=ch;
T->left=createTree(T->left);
T->right=createTree(T->right);
}
return T;
}

void preshowTree(BiTree T){//先序遍历二叉树
if(T!=NULL){
cout<<T->x<<" ";
preshowTree(T->left);
preshowTree(T->right);
}
}

void midshowTree(BiTree T){//中序遍历二叉树
if(T!=NULL){
preshowTree(T->left);
cout<<T->x<<" ";
preshowTree(T->right);
}
}

void bhdshowTree(BiTree T){//后续遍历二叉树
if(T!=NULL){
preshowTree(T->left);
preshowTree(T->right);
cout<<T->x<<" ";
}
}

void cxshowTree(BiTree T){//层序遍历二叉树  自己写的 O(∩_∩)O哈哈~
if(T!=NULL)
s.push_back(T);
while(s.size()!=0){
T=s.at(0);
cout<<T->x<<" ";
if(T->left!=NULL)
s.push_back(T->left);
if(T->right!=NULL)
s.push_back(T->right);
s.pop_front();
}

}

void fcxshowTree(BiTree T){//   反序遍历层序遍历二叉树   既从右致左
int i=0;
if(T!=NULL)
s.push_back(T);
while(s.size()!=0){
T=s.at(0);
//cout<<T->x<<" ";
a[i++]=T->x;
if(T->right!=NULL)
s.push_back(T->right);
if(T->left!=NULL)
s.push_back(T->left);
s.pop_front();
}

}
//层序遍历与 先序遍历、中序遍历、后续遍历不同,先。中,后可采用递归方式来实现
// 而层序遍历遍历方式是 从根开始,依次向下,对每一层从左向右遍历。

//  假设mid[7]={1,2,3,4,5,6,7}  pre[4,1,3,2,6,5,7]

BiTree premidcreateTree(BiTree T,int pre[],int mid[],int length){   //给出中序遍历,先序遍历,求一颗二叉树
T=(BiTree)malloc(sizeof(Tree));
int pos;
if(!T){
exit(0);
}
if(length==0)
return NULL;//当一棵树的长度为零的时候,返回空树
for(pos=0;pos<length;pos++){   //找到根结点  ,然后根据根结点左边为左子树,根结点右边为其右子树
if(mid[pos]==pre[0])
break;
}
T->x=pre[0];
T->left=premidcreateTree(T->left,pre+1,mid,pos);    //已经使用了pre的pre[0],因此pre+1;  mid 数组不变 ,pos位置为长度
T->right=premidcreateTree(T->right,pre+pos+1,mid+pos+1,length-pos-1);  //??还
return T;
}
int main(){
Tree *T;
int i,j,k,n;
//	freopen("input.txt","r",stdin);
char c;
//	T=createTree(T);
//	cout<<"创建完毕"<<endl;
//	cout<<"preshow二叉树:";
//	preshowTree(T);
//	cout<<endl<<"midshow二叉树:";
//    midshowTree(T);
//	cout<<endl<<"bhdshow二叉树";
//	bhdshowTree(T);
//	cout<<endl<<"层序遍历二叉树";
//	cxshowTree(T);

//出中序遍历,先序遍历,求一颗二叉树

cin>>n; //输入N个不相同的正整数,为二叉树的结点
for(i=0;i<n;i++){    //中序遍历序列
cin>>mid[i];
}

for(i=0;i<n;i++){
cin>>pre[i];         //前序遍历序列
}

T=premidcreateTree(T,pre,mid,n);//得到这颗二叉树

cout<<"cushow二叉树:";    //前序遍历该二叉树
fcxshowTree(T);
for(i=0;i<n;i++){
cout<<a[i];
if(i!=n-1)
cout<<" ";
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: