【16年浙江省赛H ZOJ 3965】Binary Tree Restoring 【两个dfs序还原】
题意:
给出两个dfs序列,求出一个二叉树,使得该二叉树满足这两个dfs序列。
思路:
看到这个题,比较容易想到的就是给出二叉树前、中序遍历,求二叉树的后序遍历。因此本题的思路就是对于序列中的每一段递归判断。dfs过程中给出当前两个序列的父亲节点,然后在序列的对应位置进行判断,如果两个节点相同,则这两个节点都属于当前dfs中的父亲节点。
如果这两个节点不相同,则各自找到该节点在另一个序列中对应的位置,将两段dfs序列取出再次进行递归。然后将剩下没分配到的序列一起再递归,此时要注意从当前的父亲节点往上找,找一个度数小于2的点作为这个递归过程的父亲节点。
解释一下第一个样例,3 4 2 5 1 6 与 3 4 5 2 1 6,首先3是根节点,然后序列变成 4 2 5 1 6 与 4 5 2 1 6,然后两段第一个均为4,则4是3的儿子,序列变成 2 5 1 6 与 5 2 1 6,2与5不相同,则在另一个序列中找到2、5对应位置,将两段进行递归。则现在需要递归三段,分别为 2 2、5 5、1 6,2 2的父亲节点是4,5 5的父亲节点也是4,1 6 的父亲节点是不断往上找一个度数小于2的点,因此最后找到了3。具体过程可以看代码。
总结:
此时本题代码很短,而且大致思路也就是切分dfs序列,然后再递归匹配,不过对于序列中第一个数字相同或者不同有多种处理方式,因此需要在纸上多进行模拟。上述算法的核心思路就是递归向上找一个点的度数小于2,因为题目保证有解,因此此种解法正确。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int N = 1e5+1000;int n,fa[N],a[N],b[N],pa[N],pb[N],deg[N];inline void read(int &n)
{char ch=' ';int q=0,w=1;for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());if(ch=='-')w=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;
}inline void write(int x){static const int maxlen = 100;static char s[maxlen];if(x < 0) {putchar('-');x=-x;}if(!x){putchar('0'); return;}int len = 0; for(;x;x/=10) s[len++] = x % 10+'0';for(int i = len-1; i >= 0; --i) putchar(s[i]);
}void solve(int x1,int x2,int len,int f)
{// printf("(%d,%d) (%d,%d), f:%d\n",x1,y1,x2,y2,f);if(len <= 0 || x1 > n || x2 > n){return;}if(a[x1] != b[x2]){int s1 = pb[a[x1]]; //b中位置int s2 = pa[b[x2]]; //a中位置int len1 = s2-x1;int len2 = s1-x2;solve(x1,s1,len1,f);solve(s2,x2,len2,f);while(deg[f] >= 2 && f!= 0) f=fa[f];solve(x1+len1+len2,x2+len1+len2,len-len1-len2,f);}else{deg[f]++;fa[a[x1]] = f;solve(x1+1,x2+1,len-1,a[x1]);}
}int main()
{int T;read(T);while(T--){read(n);rep(i,0,n) deg[i] = 0;rep(i,1,n){read(a[i]);pa[a[i]] = i;} rep(i,1,n){read(b[i]);pb[b[i]] = i;} fa[a[1]] = 0;solve(2,2,n-1,a[1]);rep(i,1,n){write(fa[i]);if(i == n) printf("\n");else printf(" ");}}return 0;
}
【16年浙江省赛H ZOJ 3965】Binary Tree Restoring 【两个dfs序还原】相关推荐
- ZOJ 3965 Binary Tree Restoring
Binary Tree Restoring 思路: 递归 比较a序列和b序列中表示同一个子树的一段区间,不断递归 代码: #include<bits/stdc++.h> using nam ...
- LeetCode 94. Binary Tree Inorder Traversal--二叉树中序遍历--递归,迭代--C++,Python解法
题目地址:Binary Tree Inorder Traversal - LeetCode Given a binary tree, return the inorder traversal of i ...
- Flatten Binary Tree to Linked List (DFS)
Given a binary tree, flatten it to a linked list in-place. For example, Given 1/ \2 5/ \ \3 4 6 The ...
- 【ZJCPC2019 第16届 浙江省赛】The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)
补题地址:https://zoj.pintia.cn/home/news 搜索16th 本文按照通过率补的题 G .Lucky 7 in the Pocket 题意:给出T个数,对于每个数,找出一个能 ...
- LeetCode Flatten Binary Tree to Linked List (dfs)
问题:给出一个二叉树,按照前序遍历方式转变成一个链表. 思路: 将节点的右子树链接到左子树的最右结点,同时将结点的左子树赋值给当前结点的右孩子结点.依次这样处理即可. 具体代码参考: https:// ...
- 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 【2016浙江省赛:区间取模】E : Modulo Query | ZOJ - 3940
2016浙江省赛:E 题 Modulo Query [难度] 4.5/104.5/104.5/10 据说是卡银题?感觉有点难 [题意] F(i,X)={XmodA1i=1F(i−1,X)modAi2≤ ...
- 2021浙江省赛题解(A,C,F,G,J,L,M)
2021浙江省赛题解(A,C,F,G,J,L,M) A.League of Legends 题解 签到题 直接求和判断一下 注意会爆 i n t int int以及相等的情况. 代码 #include ...
- 2022浙江省赛、ICPC昆明区域赛 游·寄
前夜 周六打的浙江省赛.周日昆明区域赛,周五平常作息,早上和爸妈聊天 我说道 金华疫情情况还好,还能出校吃饭,没想到 噩耗马上就来了.金华突然有了几例阳性,其中有一位还是滴滴司机.线上教学的消息已发出 ...
- 2019 ICPC 南昌网络赛 H. The Nth Item
2019 ICPC 南昌网络赛 H. The Nth Item 题目大意:已知一个数列F(n): F(0)=0,F(1)=1 F(n)=3∗F(n−1)+2∗F(n−2),(n≥2) 给你一个操作 ...
最新文章
- Kafka常用命令大全
- openstack rabbitmq
- php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST
- CSS中z-index
- 分布式通信协议RPC协议简介
- GroupBox控件
- 1.1.0-简介-P11-分布式锁的解决方案
- 谁在指使这家印度 IT 公司攻击全球政治家、投资者和记者?
- 解决 No utmpx entry. You must exec login from the lowest level shell.
- STM8单片机STVD环境新建工程笔记
- 计算机主机异常经常蓝屏,电脑频繁蓝屏怎么办
- 多伦多计算机科学排名,2017加拿大大学专业排名:计算机科学类项目
- excel批量删除单元格中的部分内容
- 在文档类中控制舞台上影片剪辑
- Android实现SSL Socket双向认证
- echarts (二) 之canvas设置地图背景图
- 1.C语言的特点和学习目标
- Java图形化GUI界面
- C# AssemblyInfo.cs文件的作用
- 【并查集】HAOI破译密文