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; }
相关文章推荐
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- 团体程序设计天梯赛L2-011 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PTA L2-011 玩转二叉树 (镜像反转)
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT - L2-011. 玩转二叉树(分冶)
- PAT ~ L2-011. 玩转二叉树 (树的遍历互求 + 交换左右节点)
- L2-006. 树的遍历&&L2-011. 玩转二叉树