poj2255Tree Recovery【二叉树重构】

大意:告诉你一棵二叉树的先序遍历和中序遍历求该二叉树的后续遍历

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 const int maxn = 30;
 7 char pr[maxn], mi[maxn];
 8
 9 struct Node {
10     int left;
11     int right;
12 }tr[maxn];
13
14 int root;
15
16 void init(int p) {
17     tr[p].left = -1;
18     tr[p].right = -1;
19 }
20
21 void fason(int pa, int son) {
22     if(son < pa) {
23         if(tr[pa].left == -1) {
24             init(son);
25             tr[pa].left = son;
26         } else fason(tr[pa].left, son);
27     } else {
28         if(tr[pa].right == -1) {
29             init(son);
30             tr[pa].right = son;
31         } else fason(tr[pa].right, son);
32     }
33 }
34
35 void build_tree() {
36     for(int i = 0; mi[i]; i++) {
37         if(mi[i] == pr[0]) {
38             root = i;
39             init(root);
40             break;
41         }
42     }
43     for(int i =1; pr[i]; i++) {
44         for(int j = 0; mi[j]; j++) {
45             if(mi[j] == pr[i]) {
46                 fason(root, j);
47                 break;
48             }
49         }
50     }
51 }
52 void pre_out(int p) {
53     printf("%c", mi[p]);
54     if(tr[p].left != -1) pre_out(tr[p].left);
55     if(tr[p].right != -1) pre_out(tr[p].right);
56 }
57 void mid_out(int p) {
58     if(tr[p].left != -1) mid_out(tr[p].left);
59     printf("%c", mi[p]);
60     if(tr[p].right != -1) mid_out(tr[p].right);
61 }
62
63 void back_out(int p) {
64     if(tr[p].left != -1) back_out(tr[p].left);
65     if(tr[p].right != -1) back_out(tr[p].right);
66     printf("%c", mi[p]);
67 }
68
69 int main() {
70     while(EOF != scanf("%s %s",pr, mi) ) {
71         build_tree();
72         pre_out(root);
73         puts("");
74         mid_out(root);
75         puts("");
76         back_out(root);
77         puts("");
78     }
79     return 0;
80 }

时间: 2024-11-05 18:58:53

poj2255Tree Recovery【二叉树重构】的相关文章

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

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 L

二叉树重构

给你一颗真二叉树(节点要么没有孩子,要么有两个孩子)的前序和后序遍历输出中序遍历序列. /************************************************************************* > File Name: Euler.cpp > Author: acvcla > QQ: > Mail: [email protected] > Created Time: 2014年10月30日 星期四 11时19分11秒 *******

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

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

重构二叉树

重构二叉树 这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 一.二叉树的数据结构 做题之前,我们先熟悉下二叉树的数据结构.其一,定义:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定

XCode v9.6.2017.0830

新生命团队基础框架X组件,包括网络.数据库.安全.多线程.反射.序列化.模版引擎.服务代理.远程过程调用等模块,包括Mvc后台魔方.超级码神工具.消息队列等子系统,支持Mono/Android/iOS/NetStandard. 新生命开发团队 网站:http://www.NewLifeX.comQQ群:1600800 项目源码位置 国内 http://git.NewLifeX.com/NewLife/X国外 https://github.com/NewLifeX/X 数据中间件XCode主要功能

数据结构 - 二叉树(重构 + 遍历)

写在前面 昨天有同学问到我一题关于重构二叉树的问题(link),做了一下,也做个记录吧! 所谓二叉树的重构,就是给你前序和中序,或者中序和后序,让你还原这棵二叉树. 注意:给出前序和后序是不能唯一确定一棵二叉树的,证明请看这儿. 一.给出前序和中序,重构二叉树 一个递归的过程: 当前结点的value:每一轮根据前序的第一个元素确定当前结点值. 左子树的中序遍历数组:以当前结点的value为分界点,将中序分为左部分和右部分,左部分即为左子树的中序遍历数组. 右子树的中序遍历数组:以当前结点的val