L2-011 玩转二叉树

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;
	
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值