HDU 1710 Binary Tree Traversals (二叉树遍历)
Binary Tree Traversals
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2442 Accepted Submission(s): 1063
In a preorder traversal of the vertices of T, we visit the root r followed by visiting the vertices of T1 in preorder, then the vertices of T2 in preorder.
In an inorder traversal of the vertices of T, we visit the vertices of T1 in inorder, then the root r, followed by the vertices of T2 in inorder.
In a postorder traversal of the vertices of T, we visit the vertices of T1 in postorder, then the vertices of T2 in postorder and finally we visit r.
Now you are given the preorder sequence and inorder sequence of a certain binary tree. Try to find out its postorder sequence.
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
题意:
给你一个前序遍历和中序遍历,要求后序。
可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根借点, 那么在
中序中找到这个结点, 则这个结点左边的节点属于左子树, 右边的属于右子树。然后递归遍历就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack> using namespace std; const int N=; int n,pre[N],in[N]; //先序数组和后序数组
stack<int> st; //存放父节点 void build(int l1,int r1,int l2,int r2){ //l1,r1,是先序遍历的数组的开始和末尾,l2,r2是中序遍历的数组的开始和末尾
int i,j;
st.push(pre[l1]); //父节点入栈
for(i=l2;i<=r2;i++)
if(in[i]==pre[l1]) //找到父节点在中序遍历的位置i
break;
j=l1+(i-l2+); //确定左子树和右子树在先序遍历的分界点j,即右子树的父节点
if(j<=r1 && i+<=r2) //求解右子树
build(j,r1,i+,r2);
if(l1+<=j- && l2<=i-) //求解左子树
build(l1+,j-,l2,i-);
} int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d",&n)){
for(int i=;i<n;i++)
scanf("%d",&pre[i]);
for(int i=;i<n;i++)
scanf("%d",&in[i]);
build(,n-,,n-);
while(!st.empty()){
printf("%d",st.top());
st.pop();
if(!st.empty())
printf(" ");
}
printf("\n");
}
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<cstdlib> using namespace std; const int N=; struct Tree{
Tree *l,*r;
int x;
}tree; Tree *root; Tree *Create(int *pre,int *in,int n){
Tree *tmp;
for(int i=;i<n;i++)
if(pre[]==in[i]){ //找到中序遍历时的根节点
tmp=(Tree *)malloc(sizeof(Tree));
tmp->x=in[i];
tmp->l=Create(pre+,in,i); //中序历遍中在根节点左边的都是左子树上的
tmp->r=Create(pre+i+,in+i+,n-(i+)); //在根节点右边的,都是右子树上的,右子树需要从i+1开
return tmp;
}
return NULL;
} void PostOrder(Tree *rt){ //后序历遍
if(rt!=NULL){
PostOrder(rt->l);
PostOrder(rt->r);
if(rt==root)
printf("%d\n",rt->x);
else
printf("%d ",rt->x);
}
} int main(){ //freopen("input.txt","r",stdin); int n,pre[N],in[N]; //先序数组和后序数组
while(~scanf("%d",&n)){
root=NULL;
for(int i=;i<n;i++)
scanf("%d",&pre[i]);
for(int i=;i<n;i++)
scanf("%d",&in[i]);
root=Create(pre,in,n);
Tree *rt=root;
PostOrder(rt);
}
return ;
}
HDU 1710 Binary Tree Traversals (二叉树遍历)的更多相关文章
- hdu 1710 Binary Tree Traversals 前序遍历和中序推后序
题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (J ...
- HDU 1710 Binary Tree Traversals(二叉树)
题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; ty ...
- hdu1710(Binary Tree Traversals)(二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 1710 Binary Tree Traversals(树的建立,前序中序后序)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 1710 Binary Tree Traversals(二叉树遍历)
传送门 Description A binary tree is a finite set of vertices that is either empty or consists of a root ...
- 【二叉树】hdu 1710 Binary Tree Traversals
acm.hdu.edu.cn/showproblem.php?pid=1710 [题意] 给定一棵二叉树的前序遍历和中序遍历,输出后序遍历 [思路] 根据前序遍历和中序遍历递归建树,再后续遍历输出 m ...
- HDU 1710 Binary Tree Traversals
题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历 首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树 前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗 ...
- hdu 1701 (Binary Tree Traversals)(二叉树前序中序推后序)
Binary Tree Traversals T ...
- hdu1710 Binary Tree Traversals(二叉树的遍历)
A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjo ...
随机推荐
- 强化Linux安全的10个技能
1.找出不必要的服务 很明显,服务器上跑的服务,并不是每个都有用的.强烈建议检查并关掉不需要的服务,从而减少风险(多跑一个服务,就可能多几个漏洞). 查询运行在runlevel 3的服务列表: [af ...
- 如何对 GIT 分支进行规划?
项目背景: 该项目是在2011年11月份使用Asp.net三层帮荷兰某个客户开发的机票预定系统 该客户主要是做中国与欧洲的旅行社业务,特别是最近两年由于中国的发展因此客户也越来越重视机票业务 于是他们 ...
- Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found
Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机用docker-machine ls 列出来的时候显示Ip Not found, 是什么原因那? [答案] 看这个帖子: ht ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- 关于extern "C"(详细剖析)
[目录] 引言 extern “C”的前世今生 小心门后的未知世界 Q&A c++调用c的方法 c调用c++的方法 在你工作过的系统里,不知能否看到类似下面的代码. 这好像没有什么问题,你应该 ...
- Android ART runtime简述
此文章原始是PPT格式已转换为PDF,完整内容也能够下载文档阅读: AndroidARTruntimeOverview watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5 ...
- HDFS之FileStatus
任何文件系统的一个重要特性都是提供其目录结构浏览和检索它所存文件和目录相关信息的功能.FileStatus对象封装了文件系统中文件和目录的元数据,包括文件的长度.块大小.备份数.修改时间.所有者以及权 ...
- css布局 三栏 自动换行
1.代码实现 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...
- ReactNative踩坑日志——函数绑定this
ES6语法定义的函数没有自动绑定this,所以在函数中使用了 this.xxx 就会报错,因为没有把类实例等this传进函数中. 有两种方法绑定this: 法1:在构造函数中为其他函数绑定this c ...
- java 判断String字符串是不是json数据
java 判断String字符串是不是json数据 CreationTime--2018年8月24日18点23分 Author:Marydon JSONObject jo = null; try ...