题意:

给出两个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序还原】相关推荐

  1. ZOJ 3965 Binary Tree Restoring

    Binary Tree Restoring 思路: 递归 比较a序列和b序列中表示同一个子树的一段区间,不断递归 代码: #include<bits/stdc++.h> using nam ...

  2. LeetCode 94. Binary Tree Inorder Traversal--二叉树中序遍历--递归,迭代--C++,Python解法

    题目地址:Binary Tree Inorder Traversal - LeetCode Given a binary tree, return the inorder traversal of i ...

  3. 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 ...

  4. 【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个数,对于每个数,找出一个能 ...

  5. LeetCode Flatten Binary Tree to Linked List (dfs)

    问题:给出一个二叉树,按照前序遍历方式转变成一个链表. 思路: 将节点的右子树链接到左子树的最右结点,同时将结点的左子树赋值给当前结点的右孩子结点.依次这样处理即可. 具体代码参考: https:// ...

  6. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  7. 【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≤ ...

  8. 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 ...

  9. 2022浙江省赛、ICPC昆明区域赛 游·寄

    前夜 周六打的浙江省赛.周日昆明区域赛,周五平常作息,早上和爸妈聊天 我说道 金华疫情情况还好,还能出校吃饭,没想到 噩耗马上就来了.金华突然有了几例阳性,其中有一位还是滴滴司机.线上教学的消息已发出 ...

  10. 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) ​ 给你一个操作 ...

最新文章

  1. Kafka常用命令大全
  2. openstack rabbitmq
  3. php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST
  4. CSS中z-index
  5. 分布式通信协议RPC协议简介
  6. GroupBox控件
  7. 1.1.0-简介-P11-分布式锁的解决方案
  8. 谁在指使这家印度 IT 公司攻击全球政治家、投资者和记者?
  9. 解决 No utmpx entry. You must exec login from the lowest level shell.
  10. STM8单片机STVD环境新建工程笔记
  11. 计算机主机异常经常蓝屏,电脑频繁蓝屏怎么办
  12. 多伦多计算机科学排名,2017加拿大大学专业排名:计算机科学类项目
  13. excel批量删除单元格中的部分内容
  14. 在文档类中控制舞台上影片剪辑
  15. Android实现SSL Socket双向认证
  16. echarts (二) 之canvas设置地图背景图
  17. 1.C语言的特点和学习目标
  18. Java图形化GUI界面
  19. C# AssemblyInfo.cs文件的作用
  20. 【并查集】HAOI破译密文

热门文章

  1. wxpython仿写记事本
  2. 利用新浪api获取ip归属地
  3. Alpha和索引色透明
  4. Vector和Arraylist的区别
  5. springmvc 表单中文乱码解决方案
  6. mysql linq 事务_一步一步学Linq to sql(七):并发与事务
  7. linux清理磁盘空间_Ubuntu上释放磁盘空间的几种简单方法
  8. 导出快吗_技巧分享:常用的BOOX电纸书操作,这些技能你都会吗?
  9. 浮点型变量的误差问题
  10. c++ pipe 同步 互斥_LiteOS内核教程04 | 信号量(任务同步)