POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)
题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列。
思路:见代码,采用递归。
#include <iostream>
#include <stdio.h>
#include <string.h>
/*
由一颗二叉树的前序遍历和中序遍历,输出该二叉树的后序遍历。
*/
using namespace std;
const int maxn=;
int len;
char dlr[maxn],ldr[maxn]; //dlr:前序遍历的序列,ldr:中序遍历的序列
/*
l1,r1:前序遍历的区间段
l2,r2:中序遍历的区间段
这两个区间对应的是同一颗子树
*/
void dfs(int l1,int r1,int l2,int r2) {
int k;
/*
由于l1,r1为前序遍历,所以dlr[l1]必为该子树的根节点,因此在ldr的区间段[l2,r2]中查找与根节点相同的字符,设索引为k。
若k>l2,说明左子树存在,节点有leftsize=k-l2个。
中序遍历中[l2,k-1]为该左子树的遍历结果,前序遍历中[l1+1,l1+a]为左子树的遍历结果,然后递归。
若k>r2,说明右子树存在。
中序遍历中[k+1,r2]为该右子树的遍历结果,前序遍历中[l1+a+1,r1]为右子树的遍历结果,然后递归。
最后输出该树的根节点dlr[l1]或者ldr[k]。
*/
for(int i=l2; i<=r2; i++) {
if(dlr[l1]==ldr[i]) {
k=i;
break;
}
}
int leftsize=k-l2; //左子树的大小
if(k>l2) {
dfs(l1+,l1+leftsize,l2,k-);
}
if(k<r2){
dfs(l1+leftsize+,r1,k+,r2);
}
printf("%c",dlr[l1]); //输出根节点
}
int main() {
while(scanf("%s%s",dlr,ldr)!=EOF) {
len=strlen(dlr);
dfs(,len-,,len-);
printf("\n");
}
return ;
}
POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)的更多相关文章
- POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)
1.前序遍历的规则:(根左右) (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 对于图中二叉树,前序遍历结果:ABDECF 2.中序遍历的规则:(左根右) (1)中序遍历左子树 (2)访 ...
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...
- POJ 2255. Tree Recovery
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11939 Accepted: 7493 De ...
- POJ 2255 Tree Recovery 二叉树的遍历
前序和中序输入二叉树,后序输出二叉树:核心思想只有一个,前序的每个根都把中序分成了两部分,例如 DBACEGF ABCDEFG D把中序遍历的结果分成了ABC和EFG两部分,实际上,这就是D这个根的左 ...
- Poj 2255 Tree Recovery(二叉搜索树)
题目链接:http://poj.org/problem?id=2255 思路分析:根据先序遍历(如DBACEGF)可以找出根结点(D),其后为左右子树:根据中序遍历(如ABCDEFG),已知根结点(D ...
- POJ 2255 Tree Recovery 二叉树恢复
一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求依据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 只是 ...
- poj 2255 Tree Recovery 分治
Tree Recovery Description Little Valentine liked playing with binary trees very much. Her favorite g ...
- poj 2255 Tree Recovery(求后序遍历,二叉树)
版权声明:本文为博主原创文章,未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/37699219 转载请注明出处 ...
- POJ 2255 Tree Recovery 树的遍历,分治 难度:0
http://poj.org/problem?id=2255 #include<cstdio> #include <cstring> using namespace std; ...
随机推荐
- The breakpoint will not currently be hit. No symbols have been loaded for this document."
C# exe calls function from a native C++ DLL, and breakpoints set inside C++ source code cannot be hi ...
- Populating Next Right Pointers in Each Node II
题目地址: https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 关键思路:讲节点的左右子节 ...
- C++ 嵌入汇编 获取CPU信息
#include "windows.h" #include "iostream" #include "string" using names ...
- Java开发者常犯的十个错误
翻译自:Top 10 Mistakes Java Developers Make 文章列出了Java开发者最常犯的是个错误. 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开 ...
- 抽象类(abstract)是否可以继承自实体类 ?
可以. 但是这个实体类必须有无参构造函数(默认的构造函数). 如: public class A { //这个构造函数必须要有(在没有构造函数重载时可以省略,因为运行时会为A添加默认构造函数) pub ...
- 关于getpw系列函数返回的静态区域
首先说一下什么是getpw系列函数,它主要是指这些函数: 这些函数根据一个用户名(getpwnam和getpwnam_r两个函数)或者一个用户ID(getpwuid和getpwuid_r)来获取这个用 ...
- Linux C 程序 进程控制(17)
进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...
- NSS_05 数据访问选型
在数据访问层上很想用orm框架, 选用Nhibernate或ef, 可以直接操作类对象, 避免转换, 更加的面向对象,更重要的是开发起来就方便多了. 但是从网上了解到这些框架太高级了, 用得不好到时会 ...
- jquery 1.6发布后,增加prop()方法部分取代attr()方法
以前的jq中,全部使用attr来访问对象的属性,比如取一个图片的alt属性,就可以这样做$('#img').attr('alt'); 但是在某些时候,比如访问checkbox的disabled属性 ...
- js----方法是否加括号的问题
在我们js编写程序的时候,我们会写很多函数然后调用它们,那么这些函数调用的时候什么时候加()什么时候不加()?记住以下几个要点. (1)函数做参数时都不要括号. function fun(e) { a ...