zoukankan      html  css  js  c++  java
  • L2-011. 玩转二叉树

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

    输入格式:

    输入第一行给出一个正整数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;
    }
  • 相关阅读:
    Matlab/Simulink仿真中如何将Scope转化为Figure?
    圆形Camera预览实现
    [转]自定义Drawable实现灵动的红鲤鱼动画(下篇)
    [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)
    EventBus源码分析
    Camera 预览变形问题解决
    使用javacv录像,同时进行讯飞声纹认证
    Camera2必知必会
    Flutter混合工程改造实践
    讯飞语音唤醒SDK集成流程
  • 原文地址:https://www.cnblogs.com/8023spz/p/7353337.html
Copyright © 2011-2022 走看看