HDU1710Binary Tree Traversals
题目大意:给一个树的前序遍历和中序遍历,要求输出后序遍历。
(半年前做这道题做了两天没看懂,今天学了二叉树,回来AC了^ ^)
首先介绍一下二叉树。二叉,即每个节点最多连向下连两个结点,也就是最多两个孩子。
如题目描述,二叉树就长这样~
如①②③结点中①是根节点,②是左儿子③是右儿子,其余类似。
前序遍历就是先根节点,然后左儿子,右儿子
中序遍历就是先左儿子,然后根节点,右儿子
后序遍历就是先左儿子,然后右儿子,最后根节点
也就是说前中后描述的是访问根节点的顺序~
通过递归可以很简单遍历二叉树。
首先定义结构体BiTree为二叉树结点
struct BiTree
{
int data;
BiTree * l, *r;//左右儿子
};
前序
void print_qx(BiTree *t)
{
if (t != NULL)
{
printf("%d ", t->data);
print_qx(t->l);
print_qx(t->r);
}
}
中序
void print_zx(BiTree *t)
{
if (t != NULL)
{
print_zx(t->l);
printf("%d ", t->data);
print_zx(t->r);
}
}
建树麻烦一些,不过也可以通过递归实现。首先,我们知道
这样我们就能找到根节点,然后把左子树和右子树通过递归再去建树。最后一层要返回BULL,表示结束。
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std; struct BiTree
{
int data;
BiTree * l, *r;
} *tr; int qx[1005];
int zx[1005]; BiTree* build(int *a, int *b, int n)
{
BiTree * t = (BiTree *)malloc(sizeof(BiTree));
//根据前序和后序构造树
for (int i = 0; i < n; i++)
{
if (a[0] == b[i])
{
t->data = a[0];
t->l = build(a + 1, b, i);
t->r = build(a + i + 1, b + i + 1, n - i - 1);
return t;
}
}
return NULL;
} void print_hx(BiTree *t)
{
if (t != NULL)
{
print_hx(t->l);
print_hx(t->r);
if (t == tr)//根据后序遍历规律,如果是根节点,则是最后一个数字……
printf("%d\n", t->data);
else
printf("%d ", t->data);
}
} int main()
{
int n;
while (cin >> n)
{
for (int i = 0; i < n; i++)
cin >> qx[i];
for (int i = 0; i < n; i++)
cin >> zx[i];
tr = build(qx, zx, n);
print_hx(tr);
}
return 0;
}
-----------更新分割线----------
经过我的深思熟虑(好吧是看了别人的题解),这道题可以直接输出后序遍历而不用再去建树,这样既节省时间又节省空间。
基本思想就是先处理左儿子再处理右儿子最后处理根节点(就是输出啦)。代码也少了不少~
具体做法如下
#include <cstring>
#include <cstdlib>
#include <cstdio> int qx[1005];
int zx[1005]; void build(int *a, int *b, int n) {
// 根据前序和后序构造树
for (int i = 0; i < n; i++) {
if (a[0] == b[i]) {
build(a + 1, b, i);
build(a + i + 1, b + i + 1, n - i - 1);
if (a == qx)
printf("%d\n", a[0]);
else
printf("%d ", a[0]);
return;
}
}
} int main() {
int n;
while (scanf("%d", &n) == 1) {
for (int i = 0; i < n; i++)
scanf("%d", qx + i);
for (int i = 0; i < n; i++)
scanf("%d", zx + i);
build(qx, zx, n);
}
return 0;
}
HDU1710Binary Tree Traversals的更多相关文章
- hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)
http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java ...
- Tree Traversals
Tree Traversals 原题链接 常见的二叉树遍历的题目,根据后序遍历和中序遍历求层次遍历. 通过后序遍历和中序遍历建立起一棵二叉树,然后层序遍历一下,主要难点在于树的建立,通过中序遍历和后序 ...
- HDU 1710 二叉树的遍历 Binary Tree Traversals
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu1710(Binary Tree Traversals)(二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU-1701 Binary Tree Traversals
http://acm.hdu.edu.cn/showproblem.php?pid=1710 已知先序和中序遍历,求后序遍历二叉树. 思路:先递归建树的过程,后后序遍历. Binary Tree Tr ...
- 03-树2. Tree Traversals Again (25)
03-树2. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue ...
- HDU 1710-Binary Tree Traversals(二进制重建)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- PAT1086:Tree Traversals Again
1086. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- Binary Tree Traversals(HDU1710)二叉树的简单应用
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
随机推荐
- xcode 开发ios兼容性问题的上下黑边 和 coco2d-x 游戏分辨率适配 ResolutionPolicy::FIXED_WIDTH 都会引起上下黑边问题!!!
1:Xcode6在iPhone5+iOS7模拟器上编译,上下有黑边问题 问题描述: Xcode6环境下,对iPhone5或iPhone5s模拟器,在iOS7或iOS7.1下运行,屏幕上下有黑边.在iO ...
- GridBagLayout:网格包布局管理器
GridBagLayout:网格包布局管理器 GridBagLayout可以说是布局管理器Layout中最复杂的一个,其中涉及到的参数也比较得多,比如说: GridBagConstraints g ...
- C++中 模板Template的使用
1.在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?答:class用于定义类,在模板引入c++后,最初定义模板的方法 ...
- Linux如何在虚拟机中挂载iso yum源
首先,将作为源的iso的挂载到系统上. 代码如下: mount -o loop /dev/cdrom /mnt/iso/ 或者 mount -o loop /xxx/xxx.iso /mnt/iso/ ...
- Django Navi 重用
代码来自这里: base.html <html> <head>...</head> <body> ... {% block nav %} <ul ...
- P112、面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点.链表结点定义如下:struct ListNode{ int m_nKey; ListNode* ...
- GPS(2)关于位置的3个示例,实时获取GPS定位数据,求两个经纬点距离,邻近某个区域圆时警告
实时获取GPS定位数据 import android.app.Activity; import android.content.Context; import android.location.Loc ...
- ogg实现oracle到sql server 2005的同步
一.源端(oracle)配置1.创建同步测试表create table gg_user.t01(name varchar(20) primary key);create table gg_user.t ...
- 彻底搞清js中闭包(Closure)的概念
js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探讨一下这个玩意. 相信大家在看完后, 心中的迷惑会迎然而解. 闭包概念: 闭包就是有权 ...
- poj3254
还是那句老话:dp关键在状态: 求有多少种排布方式,是任意两头牛不相邻(有些地方不能放): 不用心,一开始还纠结了半天 和之前USACO上某题方法是一样的,每一行放或不放只有两种情况 把它当作一个二进 ...