题意是给出先序和中序,求出后序。
先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中。因为后序遍历先是左子树然后是右子树,所以在递归的时候就先递归右子树,然后继续递归左子树。
写完程序后有个错误,找了很久才发现,就是我原本在计算左子树个数的时候,是这样计算的,pre2=mid-pre,但是当pre>mid时,就不对了。而正确计算左子树的方法应该是下面这样的。
#include<iostream>
#include<cstring>
#include<stack>
using namespace std; char t1[], t2[];
stack<char>map;
int length; void solve(int pre, int mid, int len)
{
map.push(t1[pre]);
int i = mid;
while (t2[mid] != t1[pre]) mid++; //在中序序列中找到与前序序列相同的结点
int pre2 = mid - i; //左子树的数量
int mid2 = len - - pre2; //右子树的数量
if (mid2 >= )
solve(pre + pre2 + , mid + , mid2);
if (pre2 >= )
solve(pre + , mid - pre2, pre2);
} int main()
{
while (cin >> t1 >> t2)
{
length = strlen(t1);
solve(, , length);
while (!map.empty())
{
char s = map.top();
cout << s;
map.pop();
}
cout << endl;
}
return ;
}
后来数据结构实验的时候也要写这么的一个算法,主要部分就是
bintree buildBintree(char *pre, char *mid,int length)
{
int lch,rch;
bintree root;
root=(bintree)malloc(sizeof(binnode));
lch=;
root->data=*pre;
while(*mid!=*pre) {mid++;lch++;}
rch=length--lch;
if(rch>=) root->rchild=buildBintree(pre+lch+,mid+,rch);
else root->rchild=NULL;
if(lch>=) root->lchild=buildBintree(pre+,mid-lch,lch);
else root->lchild=NULL;
return root;
}
一开始没加11和13语句,然后就不对,看来这个指针问题得好好注意一下。
UVa 二叉树重建(先序+中序求后序)的更多相关文章
-
剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...
-
PAT (Advanced Level) 1136~1139:1136模拟 1137模拟 1138 前序中序求后序 1139模拟
1136 A Delayed Palindrome(20 分) 题意:给定字符串A,判断A是否是回文串.若不是,则将A反转得到B,A和B相加得C,若C是回文串,则A被称为a delayed palin ...
-
HDU 1710 二叉树遍历,输入前、中序求后序
1.HDU 1710 Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...
-
hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)
http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java ...
-
TZOJ 3209 后序遍历(已知中序前序求后序)
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
-
已知树的前序、中序,求后序的java实现&;已知树的后序、中序,求前序的java实现
public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...
-
Tree Recovery(前序中序求后序)
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14640 Accepted: 9091 De ...
-
HDU1710---树(知前序遍历与中序遍历 求后序遍历)
知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...
-
python实现根据前序与中序求后序
我就不板门弄斧了求后序 class Tree(): def __init__(self,x): self.value=x self.left=None self.right=None class So ...
随机推荐
-
【转】RHCE 7系列—RHCE考试
本篇主要以RHCE练习题为线索,介绍其中涉及的知识点. 红色引用的字为题目要求(不是正式题目,难度略低于正式题目) In serverX or desktopX 1. (lab teambridge ...
-
Java数据库——连接关闭、增删改查
连接数据库 //================================================= // File Name : MySQL_demo //-------------- ...
-
s3c6410学习笔记-烧写uboot+构建文件系统
一.进入目录 #cd u-boot-1.1.6_sndk6410 二.SD卡 make clean make distclean vim Makefile ...
-
HDU2089 不要62 BZOJ1026: [SCOI2009]windy数 [数位DP]
基础题复习 这次用了dfs写法,感觉比较好 #include <iostream> #include <cstdio> #include <cstring> #in ...
-
ajax请求经典格式
$.ajax({ url: url, type: "POST", dataType: "json", data: data, success: funtion1 ...
-
Hadoop计算平均值【转】
file1.txt a 1b 2a 3b 3a 5b 7c 3c 5 file2.txt a 1b 7c 5a 1c 3 结果: a 2.2b 4.75c 4.0 代码: package org.ap ...
-
od --http://blog.csdn.net/hgy413/article/details/7711925
http://blog.csdn.net/hgy413/article/details/7711925
-
VisualSVN 5.1.5 破解版 手动破解教程 生成dll文件
VisualSVN 5.1.5 破解版 手动破解教程 生成VisualSVN.Core.L.dll文件 附上本人用到的命令: ildasm "D:\Program Files (x86)\V ...
-
PV并发UV
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'返回结果:SYN_RECV 2 (SYN连接请求收到2个 等待确 ...
-
scrapy--Beautyleg
很早就开始关注:Beautyleg 高清丝袜美腿.关注之后开始觉得打开了新世界的大门,如果有相同观点的,那么你很有品味.说真的,学习爬虫的动力之一就是想把里面的图片爬取下来.哈哈哈!!! 给大家放点爬 ...