1. 程式人生 > >L2-011. 玩轉二叉樹

L2-011. 玩轉二叉樹

玩轉 evel pop namespace problem 給定 wap emp clu

給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裏假設鍵值都是互不相等的正整數。

輸入格式:

輸入第一行給出一個正整數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 <cstdio>
#include <cstdlib>
#include <stack>
#include <queue>
using namespace std;
int z[30],q[30];
class Tree
{
public:
    int data;
    Tree *lchild;
    Tree *rchild;
    Tree()
    {
        lchild=NULL;
        rchild
=NULL; } }*root; Tree *CreatNode() { Tree *root=new Tree(); return root; } Tree *RestoreTree(int q1,int q2,int z1,int z2) { Tree *root=CreatNode(); root->data=q[q1]; for(int i=0;z1+i<=z2;i++) { if(z[z1+i]==q[q1]) { if(i!=0)root->lchild=RestoreTree(q1+1
,q1+i,z1,z1+i-1); if(i+z1!=z2)root->rchild=RestoreTree(q1+i+1,q2,z1+i+1,z2); break; } } if(root->lchild&&root->rchild)swap(root->lchild,root->rchild); return root; } void levelOrder(Tree *root) { queue<Tree *>q; q.push(root); cout<<root->data; while(!q.empty()) { if(q.front()->lchild) { q.push(q.front()->lchild); cout<< <<q.front()->lchild->data; } if(q.front()->rchild) { q.push(q.front()->rchild); cout<< <<q.front()->rchild->data; } q.pop(); } } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>z[i]; for(int i=0;i<n;i++) cin>>q[i]; root=RestoreTree(0,n-1,0,n-1); levelOrder(root); return 0; }

L2-011. 玩轉二叉樹