UVa 二叉树重建(先序+中序求后序)
题意是给出先序和中序,求出后序。
先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中。因为后序遍历先是左子树然后是右子树,所以在递归的时候就先递归右子树,然后继续递归左子树。
写完程序后有个错误,找了很久才发现,就是我原本在计算左子树个数的时候,是这样计算的,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 ...
随机推荐
- centos设置服务开机启动
Linux CentOS设置服务开机启动的方法 by 天涯 · 2013/07/26 CentOS设置服务开机启动的两种方法 1.利用 chkconfig 来配置启动级别 在CentOS或者RedHa ...
- jquery截图插件的使用
首先感谢http://www.htmleaf.com/Demo/201504211717.html这款插件. 使用之初,对于插件的结构很是糊涂,首先文件的核心是cropper.js,其次才是mian. ...
- 学习mongo系列(九)索引,聚合,复制(副本集),分片
一.索引 二.聚合 三.复制(副本集) 四.分片 尚未实践操作. 详见http://www.runoob.com/mongodb/mongodb-indexing.html
- Oracle的控制文件
一.控制文件 oracle的控制文件是极其重要的文件,它是一个较小的二进制文件. 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 在参数文件中描述其位置, ...
- Git最佳实践
1.git init 2.git add. 3.git add README.md 4.git commit -m "init" 5.git remote add origin h ...
- EditText设置文字改变时的监听
textWatcher = new TextChangeWatcher(); etQuerryInfo.addTextChangedListener(textWatcher); /** * 文字改变类 ...
- 1017作业:配置java环境,学习流程图
- linux文件复制与权限赋值
文件file内容赋值到file2中 1. cp file1 file2 2. cat file1 > file2 3. cat < file1 > file2 4. dd if= ...
- Object.create()兼容实现方法
if (!Object.create) { Object.create = (function(){ function F(){} return function(o){ if (arguments. ...
- 点击a标签,跳转到iframe中,并在iframe中显示指定的页面
点击a标签,跳转到iframe中,并在iframe中显示指定的页面 1.用a标签的target属性 <iframe id="myFrameId" name="myF ...