UVa536 Tree Recovery (二叉树遍历)

链接:http://acm.hust.edu.cn/vjudge/problem/19645分析:三种树的遍历方式中除了中序外再知道另外遍历方式得到的序列就可以唯一确定一棵二叉树。先序:先打印根再遍历左右子树。中序:先遍历左子树,然后打印根,再遍历右子树。后序:先遍历左右子树,最后打印根。
 1 #include <cstdio>
 2 #include <cstring>
 3
 4 char pre_order[30], in_order[30];
 5
 6 void dfs(int L1, int R1, int L2, int R2) {
 7     char root = pre_order[L1];
 8     int p = L2;
 9     while (in_order[p] != root) p++;
10     int cnt1 = p - L2, cnt2 = R2 - p;
11     if (cnt1) dfs(L1 + 1, L1 + cnt1, L2, p - 1);
12     if (cnt2) dfs(R1 - cnt2 + 1, R1, p + 1, R2);
13     printf("%c", root);
14 }
15
16 int main() {
17     while (scanf("%s", pre_order) == 1) {
18         scanf("%s", in_order);
19         int n = strlen(pre_order);
20         dfs(0, n - 1, 0, n - 1);
21         printf("\n");
22     }
23     return 0;
24 }
时间: 2024-10-14 10:07:16

UVa536 Tree Recovery (二叉树遍历)的相关文章

POJ - 2255 - Tree Recovery = 二叉树遍历

http://poj.org/problem?id=2255 题意:给定先序遍历和中序遍历,求后序遍历. 回忆以前上DataStructure课的时候貌似写过类似的. 先从先序入手,从左到右扫描,进入时节点时立刻入栈,离开节点时立刻出栈. 关键是怎么知道什么时候才是立刻节点了呢? 貌似只有n^2的做法,因为要从中序遍历序列中找根. 但其实假如预处理出中序遍历的序列中的字母每个指向的位置就不用这额外的时间花费n了. 也就是从先序遍历入手,进入节点时把根节点的中序遍历序列指针两侧递归下去. 所以构造

UVA536 - Tree Recovery(递归)

题目:UVA536 - Tree Recovery(递归) 题目大意:给出一棵二叉树的前序遍历和中序遍历,求后序遍历. 解题思路:根据前序遍历将中序遍历的序列分成一棵棵子树,知道这个子树只有一个节点,然后就可以将它按顺序放到后序数组值中了. 代码: #include <cstdio> #include <cstring> const int N = 30; char preord[N], inord[N]; char postord[N]; int p1, p2, len; int

POJ 2255 Tree Recovery 二叉树恢复

一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求根据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 不过其实算法都是一样的.仿佛又回到了做Leetcode题的那段岁月中了. 还有就是输入是我特别处理过的,就两个函数,大家会了的无视,不会的可以学习下. #include <stdio.h> #include <string> #include <algorithm> using

zoj 1944 Tree Recovery (二叉树)

Tree Recovery Time Limit: 2 Seconds      Memory Limit: 65536 KB Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one

POJ 2255 Tree Recovery &amp;&amp; Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

链接:poj.org/problem?id=2255 题意: 分别给你一个二叉树的前序遍历序列和中序遍历序列,让你给出这个二叉树的后序遍历序列. 思路: 对于二叉树的三种遍历方式,都可以使用递归来实现,那么也一定可以使用递归来拆解,以达到从遍历序列确定二叉树具体结构的目的.对于前序遍历来说,第一个字母一定是根,并且在序列中根的左子树包含的点一定出现在根的右子树的前面.对于中序遍历序列来说,根前面出现的字母所代表的点一定出现在左子树中,根后面出现的字母所代表的点一定出现在右子树中.在根据前序与中序

PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历

题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子.中序遍历的顺序正好是序列从小到大的顺序,因此中序遍历的时候顺便赋值就可以了,最后层次遍历输出. 思路一:中序遍历的时候赋值 #include <iostream> #include <cstdio> #include <algorithm> #include <str

hdu1710(Binary Tree Traversals)(二叉树遍历)

Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3475    Accepted Submission(s): 1555 Problem Description A binary tree is a finite set of vertices that is either empty or

UVa536 - Tree Recovery

题意 由前序遍历和中序遍历输出后序遍历 思路 前序遍历的第一个字母为根节点,从中序遍历中找到根节点的位置,其左边为左子树,右边为右子树,递归. 总结 从网上找了由前序遍历和中序遍历输出后序遍历 和 由中序遍历和后序遍历输出前序遍历 的代码,po在下面 不能由前序遍历和后序遍历得到中序遍历 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm>

PAT A1020 Tree Traversals [二叉树遍历]

题目描述 链接 给定后序和中序,求层序结果 分析 递归实现,这里给出先序和后序,求中序的 递归:考虑中间过程 先序\([preL,preR]\) 中序\([inL,inR]\) 根节点:\(preL\) 中序根节点:\(k,a[k]==a[preL]\) 遍历可得到 中序左子树结点个数:\(k-inL\) ,左子树序列\([inL,k-1]\) 先序左子树序列\([preL+1,preL+k-inL]\) 中序右子树结点个数:\(inR-k\) , 右子树序列\([k+1,inR]\) 先序右子