TZOJ 5225: 玩转二叉树

描述

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

 

输入

输入第一行给出一个正整数N(N≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

 

输出

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

样例输入

样例输出

解题思路

解题思路对于一棵树来说前序的第一个是树的根,记录下来然后到中序里面去找
中序的左边做左子树,右边为为右子树,然后递归建树

菜鸡的成长史

觉得写的对你有帮助的关注下^-^

#include <bits/stdc++.h>
using namespace std;
int Qi[50],Zh[50];
struct Node
{
    int data;
    Node* left;
    Node* right;
};
Node* creat(int ZL,int ZR,int QL,int QR)
{          //ZL中序左边 ZR中序右边 QL前序左边 QR前序右边
    if(QL>QR) return NULL;   //返回条件
    Node *root=new Node;
    root->data=Qi[QL];
    int biaoji;
    for(int i=0;i<=ZR;i++)
    {
        if(Zh[i]==Qi[QL]) //找出根节点在中序遍历的位置
            {biaoji=i;break;}
    }
    int geshu=biaoji-ZL; //左子树 有几个
    root->left=creat(ZL,biaoji-1,QL+1,QL+geshu);
    root->right=creat(biaoji+1,ZR,QL+geshu+1,QR); //递归建树 理解表层不要深究里面的
    return root; //对递归的理解有推出条件,思路理清就行 ^-^菜鸡的理解
}

void printtf(Node *tree)    //层次遍历
{
    queue<Node*> que;
    que.push(tree);
    int flag=0;
    while(!que.empty())
    {
        Node *e=que.front();
        que.pop();
        if(flag!=0)
            cout << " ";
        cout << e->data;flag=1;
        if(e->right!=NULL)     //镜面反转:本来左到右 现在右到左
            que.push(e->right);
        if(e->left!=NULL)
            que.push(e->left);
    }
    cout << endl;
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>Zh[i];
    for(int i=0;i<n;i++)
        cin>>Qi[i];
    Node *tree=creat(0,n-1,0,n-1);
    printtf(tree);
    return 0;
}

不懂的可以访问下这个帮助理解

http://www.cnblogs.com/liujinghuan/p/5842487.html

 

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/10544343.html