POJ2255 Tree Recovery 【树的遍历】

Tree Recovery

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 11365   Accepted: 7128

Description

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 of her creations:

                                               D

                                              /
                                             /
                                            B     E

                                           / \
                                          /   \
                                         A     C     G

                                                    /

                                                   /

                                                  F

To record her trees for future generations, she wrote down two strings for each tree: a preorder traversal (root, left subtree, right subtree) and an inorder traversal (left subtree, root, right subtree). For the tree drawn above the preorder traversal is DBACEGF
and the inorder traversal is ABCDEFG.

She thought that such a pair of strings would give enough information to reconstruct the tree later (but she never tried it).

Now, years later, looking again at the strings, she realized that reconstructing the trees was indeed possible, but only because she never had used the same letter twice in the same tree.

However, doing the reconstruction by hand, soon turned out to be tedious.

So now she asks you to write a program that does the job for her!

Input

The input will contain one or more test cases.

Each test case consists of one line containing two strings preord and inord, representing the preorder traversal and inorder traversal of a binary tree. Both strings consist of unique capital letters. (Thus they are not longer than 26 characters.)

Input is terminated by end of file.

Output

For each test case, recover Valentine‘s binary tree and print one line containing the tree‘s postorder traversal (left subtree, right subtree, root).

Sample Input

DBACEGF ABCDEFG
BCAD CBAD

Sample Output

ACBFGED
CDAB

前序遍历的第一个点必定是根节点,在对应的中序遍历中找到这个点,那么在中序序列该点左边的子序列必定是左子树,右边是右子树,于是就这样递归下去,便能找到后序序列。

#include <stdio.h>
#include <string.h>
#define maxn 28

char str1[maxn], str2[maxn];

void traverse(int l1, int r1, int l2, int r2)
{
	if(l1 > r1) return;
	int rt;
	rt = strchr(str2, str1[l1]) - str2;
	traverse(l1 + 1, rt - l2 + l1, l2, rt - 1);
	traverse(rt-l2+l1+1, r1, rt+1, r2);
	putchar(str2[rt]);
}

int main()
{
	int len;
	while(scanf("%s%s", str1, str2) == 2){

		len = strlen(str1);
		traverse(0, len - 1, 0, len - 1);
		printf("\n");
	}
	return 0;
}

POJ2255 Tree Recovery 【树的遍历】

时间: 2024-07-31 21:19:02

POJ2255 Tree Recovery 【树的遍历】的相关文章

POJ 2255 Tree Recovery 树的遍历,分治 难度:0

http://poj.org/problem?id=2255 #include<cstdio> #include <cstring> using namespace std; const int maxn = 27; char pre[maxn],in[maxn]; char past[maxn]; void tre(int ps,int pe,int is,int ie,int& ind) { int lnum = strchr(in,pre[ps]) - in - is

poj2255 Tree Recovery(求后续遍历,二叉树)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=2255 Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letter

poj2255 Tree Recovery

Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11955   Accepted: 7505 Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital le

POJ2255 Tree Recovery (先序中序-》后序)

B - Tree Recovery Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2255 Appoint description: System Crawler (2016-05-08) Description Little Valentine liked

Codeforces 29D Ant on the Tree 树的遍历 dfs序

题目链接:点击打开链接 题意: 给定n个节点的树 1为根 则此时叶子节点已经确定 最后一行给出叶子节点的顺序 目标: 遍历树并输出路径,要求遍历叶子节点时按照给定叶子节点的先后顺序访问. 思路: 给每个节点加一个优先级. 把最后一个叶子节点到父节点的路径上的点优先级改为1 把倒数第二个叶子节点到父节点的路径上的点优先级改为2 如此每个点就有一个优先级,每个访问儿子节点时先访问优先级大的即可 对于无解的判断:得到的欧拉序列不满足输入的叶子节点顺序即是无解. #include <cstdio> #

11.3~11.4树的遍历(Tree Traversal)

11.3~11.4树的遍历(Tree Traversal) 通用地址系统(Universal address systems) 利用某种方式给树的顶点进行编号,具体如下(根默认为0): 遍历算法(Traversal algorithms) 前序遍历(Preorder traversal):根左右 中序遍历(Inorder traversal):左根右 后序遍历(Postorder traversal):左右根 深度优先搜索-DFS(Depth-first search) 广度优先搜索-BFS(B

树的遍历 | Tree Traversal

树的遍历方式总体上有两种:DFS和BFS: 其中DFS包含了前序.中序和后序遍历,而BFS则为层次遍历. DFS的实现方式: (1) 递归: (2) 非递归,使用辅助栈: 递归程序 public class Recursion { public void preorderRec(TreeNode root) { if (root == null) { return; } System.out.println(root.val); // visit the node preorderRec(roo

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

Tree Recovery POJ - 2255

Tree Recovery POJ - 2255 根据树的前序遍历和中序遍历还原后序遍历. (偷懒用了stl的find) 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string s1,s2; 5 int len; 6 void work(int l1,int r1,int l2,int r2) 7 { 8 if(l1==r1) 9 { 10 cout<<s1[l1]; 11 retu