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 ...
随机推荐
- Window配置Redis环境和简单使用
一.关于Redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据 ...
- Eclipse中GitLab的配置和使用入门
一.Eclipse中配置GitLab的前提条件 1.1:安装Git客户端 去官网https://git-scm.com/downloads下载合适的版本即可,一般开发环境是windows的就下载win ...
- phpmyadmin误删表后如何恢复
用mysqlbinlog php处理代码: 将mysql-bin.xxxxxx文件导出为可读文本: <?php //导出mysql-bin.000xxx文件为可读性txt文本 //0为执行成功, ...
- FPipe, CMD命令行下的端口重定向工具
英文文档: FPipe v2. - TCP/UDP port redirector. Copyright (c) by Foundstone, Inc. http://www.foundstone.c ...
- ZH奶酪:PHP 执行时间Fatal error: Maximum execution time of...
来源:http://stackoverflow.com/questions/5164930/fatal-error-maximum-execution-time-of-30-seconds-excee ...
- 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表
基于父子关系的递归结构在公司组织结构里比较常见,基本上都是在一张表里实现的自引用关系.在报表中如果要实现这种效果,并且在这个基础上做一些数据的汇总,可以使用到下面提到的方法. 要实现的效果大致如下 - ...
- MySql 比Replace Into更适合的用法,外加SqlServer的方式。
Mysql: INSERT INTO `his_examine_result` (Mid,His_Examine_Mid, His_File_Mid, ResultType, His_Employee ...
- C#中e.Cancel,e.Handled的区别与应用
首先并不是每个事件的e参数都有上述两个属性. e.Cancel:获取或设置指示是否应取消事件的值:e.Handled:获取或设置一个值,该值指示是否处理过此事件. 下面说说比较常见的场景: 1)e.c ...
- html中文显示乱码的处理方法
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 1. ht ...
- hibernate的入门crud
package com.test; import com.demo.User; import org.hibernate.HibernateException; import org.hibernat ...