给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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> #include <queue> using namespace std; typedef struct tr* ptree; typedef struct tr { int date; ptree lchild; ptree rchild; }tree; ptree premid(int pre[],int mid[],int size) { if(size<=0) { return NULL; } int i; for(i=0;i<size;i++) { if(mid[i]==pre[0]) { break; } } tree * t=new tree; t->date = pre[0]; t->lchild = premid(pre+1,mid,i); t->rchild = premid(pre+i+1,mid+i+1,size-i-1); return t; } void floorprint(ptree node,int n) { int cnt=0; queue <ptree> q; if(node==NULL) { return; } q.push(node); while(q.empty() ==false) { ptree t=q.front() ; if(t->lchild !=NULL) { q.push(t->lchild ) ; } if(t->rchild != NULL) { q.push(t->rchild ); } cnt++; cout<<q.front()->date; if(cnt!=n) { cout<<" "; } q.pop(); } } void treeswap(ptree t) { if(t->lchild ==NULL&&t->rchild ==NULL) { return; } ptree tem=t->lchild ; t->lchild = t->rchild ; t->rchild = tem; if(t->lchild!=NULL) treeswap(t->lchild); if(t->rchild!=NULL) treeswap(t->rchild); } int main() { int n,pre[40]={0},mid[40]={0}; cin>>n; for(int i=0;i<n;i++) { scanf("%d",&mid[i]); } for(int i=0;i<n;i++) { scanf("%d",&pre[i]); } ptree head=premid(pre,mid,n); treeswap(head); floorprint(head,n); }
结果如下:
标签:lchild,27,--,int,二叉树,rchild,NULL,ptree From: https://www.cnblogs.com/daniel350-wang/p/17344195.html