首页 > 其他分享 >团体天梯练习 L2-011 玩转二叉树

团体天梯练习 L2-011 玩转二叉树

时间:2023-04-17 14:36:26浏览次数:49  
标签:pre 遍历 int 011 L2 二叉树 include root

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


解题思路

首先需要根据所给的二叉树中序遍历序列和后序遍历序列得到二叉树,在这里不过多解释是怎么做的,详情可以看我之前写的另一篇随笔 根据前中后序遍历中的两种构造二叉树

然后是二叉树的镜像,这里只需要用一个递归来实现就行了。首先深度优先搜索得到镜像的左子树和镜像的右子树,然后再分别赋值给当前节点的右孩子和左孩子,最后返回当前节点。递归的边界条件也很简单,当出现空节点时,返回 \(NULL\) 即可。

最后是二叉树的层序遍历,这个也是非常基础的操作,不多说了。 二叉树的层次遍历

/*   一切都是命运石之门的选择  El Psy Kongroo  */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<functional>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<double, double> pdd;
typedef pair<string, int> psi;
typedef __int128 int128;
#define PI acos(-1.0)
#define x first
#define y second
//int dx[4] = {1, -1, 0, 0};
//int dy[4] = {0, 0, 1, -1};
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;

int n;
unordered_map<int, int> in_idx;  //中序遍历的对应下标
vector<int> pre;  //中序 前序
typedef struct node{
    int val;
    struct node *left, *right;
}node;
node *T;
vector<int> res;  //层序遍历结果

// 中序遍历和前序遍历构造二叉树
node* build(int in_l, int in_r, int pre_l, int pre_r){
    if(in_l > in_r || pre_l > pre_r) return NULL;
    int root_val = pre[pre_l];   //前序遍历第一个节点为子树根节点
    int mid = in_idx[root_val];  //定位根节点坐标
    int left_num = mid - in_l;  //左子树节点个数

    node *root = new node;
    root->val = root_val;
    root->left = build(in_l, mid - 1, pre_l + 1, pre_l + left_num);
    root->right = build(mid + 1, in_r, pre_l + left_num + 1, pre_r);

    return root;
}

//二叉树镜像
node* dfs(node *root){
    if(!root) return NULL;

    node *l = dfs(root->left);   //递归镜像左子树
    node *r = dfs(root->right);  //递归镜像右子树
    root->left = r, root->right = l;

    return root;
}

//层序遍历
void bfs(){
    queue<node*> q;
    q.push(T);

    while(!q.empty()){
        int nn = (int)q.size();
        while(nn -- ){
            node *t = q.front();
            q.pop();
            res.push_back(t->val);

            if(t->left) q.push(t->left);
            if(t->right) q.push(t->right);
        }
    }
}

void show(){
    for(int i = 0; i < n - 1; i ++ ) cout << res[i] << ' ';
    cout << res[n - 1];
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n;
    pre.resize(n);
    for(int i = 0; i < n; i ++ ){
        int x; cin >> x;
        in_idx[x] = i;        //记录中序遍历各节点值对应的下标
    }
    for(int i = 0; i < n; i ++ ) cin >> pre[i];

    T = build(0, n - 1, 0, n - 1);  //建树

    T = dfs(T);     //二叉树翻转(镜像)

    bfs();

    show();

    return 0;
}

标签:pre,遍历,int,011,L2,二叉树,include,root
From: https://www.cnblogs.com/MAKISE004/p/17325714.html

相关文章

  • 根据前序遍历和中序遍历重建二叉树
    LeetCode105.给定两个整数数组preOrder和inOrder,其中preOrder是二叉树的先序遍历,inOrder是二叉树的中序遍历,请构造二叉树并返回其根节点/***Definitionforabinarytreenode.*publicclassTreeNode{*publicintval;*publicTreeNodeleft;*......
  • 团体天梯练习 L2-010 排座位
    L2-010排座位布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。输入格式:输入第一行给出3个正整数:\(N(≤100)\),即前来参宴的宾客总人数,则......
  • 团体天梯练习 L2-009 抢红包
    L2-009抢红包没有人没抢过红包吧……这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。输入格式:输入第一行给出一个正整数\(N(≤10^{4})\),即参与发红包和抢红包的总人数,则这些人从\(1\)到\(N\)编号。随后\(N\)行,第\(i\)行给出编号为\(i\)的......
  • 团体天梯练习 L2-008 最长对称子串
    L2-008最长对称子串对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定IsPAT&TAPsymmetric?,最长对称子串为sPAT&TAPs,于是你应该输出11。输入格式:输入在一行中给出长度不超过1000的非空字符串。输出格式:在一行中输出最长对称子串的长度。输入样例:IsPAT&TAP......
  • 团体天梯练习 L2-007 家庭房产
    L2-007家庭房产给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。输入格式:输入第一行给出一个正整数$N(≤1000)$,随后N行,每行按下列格式给出一个人的房产:编号父母\(k\)孩子1...孩子\(k\)房产套数总面积其中编号是每个......
  • Uva--679 Dropping Balls(二叉树的编号)
    记录23:282023-4-16https://onlinejudge.org/external/6/679.pdfreference:《算法竞赛入门经典第二版》例题6-6二叉树,这里是完全二叉树,使用模拟的方式应该会TLE(虽然我用模拟的方式也TLE了,但不是这个原因,下面会提到原因)不用模拟的方式,转换思路,使用递归的方式去思考。这里......
  • 团体天梯练习 L2-001 紧急救援
    L2-001紧急救援作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快......
  • APP爬虫初阶之Pixel2刷机root
    pixel2刷机刷机准备lineageziptwrpimgmagiskzip(github上下的是APK,需要把后缀改为zip)刷机步骤首先需要一个底包,这里我用的出厂自带的google官方系统,没有重新刷入手机上打开usb调试,关闭屏幕超时锁屏,打开OEM锁手机完全关机,按住向下键重启(或者通过adbrebootbootl......
  • 平衡二叉树——C语言描述——创建,增加结点
    平衡二叉树——C语言描述——创建,增加结点目录平衡二叉树——C语言描述——创建,增加结点0测试用例框架1定义2数据结构2增加平衡二叉树的结点(1)代码(2)测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%2......
  • 数据结构-->二叉树 OJ_01
    经过前几期浴血奋战!!二叉树便要进入应用阶段了!今天,为大家带来几道OJ题的讲解!1.单值二叉树如果二叉树每个结点都具有相同的值,那么该二叉树就是单值二叉树只有给定的树是单值二叉树时,才会返回true,否则返回false下面为了方便理解,进行图解举例:>有上述的两种情况,其中还需要考虑到......