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 ...
随机推荐
- 函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)
最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http ...
- 去除右键菜单opendlg
环境:windows8.1专业版 未知文件类型,右键会多出一个opendlg的选项!下面是移除的方法: 将下面的内容复制到记事本,并另存为XXX .reg,导入注册表即可! Windows Reg ...
- P78、面试题10:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制1001,有2位是1.因此如果输入9,该函数输出2. 相关题目: 1)用一条语句判断一个整数是不是2的整数次方.一 ...
- Linux的分段和分页机制
1.分段机制 80386的两种工作模式 80386的工作模式包括实地址模式和虚地址模式(保护模式).Linux主要工作在保护模式下. 分段机制 在保护模式下,80386虚地址空间可达16K个段,每 ...
- nyist 510昂贵的聘礼
/* 好好的图论题啊,最短路的应用,dijkstra算法 */ #include <iostream> using namespace std; const int INF=100000; ...
- umount nfs状态为busy的处理方法
umountall状态为busy的系统: 以下四种情况,文件系统都会显示:umount: file_system_name busy 1 A program is accessing a file o ...
- *gravity的取值详表
android有 android:layout_gravity 和 android:gravity,前者设置相对父控件布局,后者是设置自己内部的控件的布局. Value Description top ...
- js标点符号全局匹配
var modelCode = node.modelCode.replace(/\./g, '\_'); 注意后面的 "\" <script language=" ...
- UVa 753 (二分图最大匹配) A Plug for UNIX
题意: 有n个插座,m个设备以及k种转化器(每种转化器视为有无限个). 转换器A->B可以将A类型的插头转化成B类型的插头,所以可以插在B类型的插座上. 求最少剩多少不匹配的设备. 分析: 抛开 ...
- Arch 常用工具
一.网络浏览 pacman -S firefox firefox-i18n注:该命令中的前者为 Firefox 主程序,后者为语言包.pacman -S opera 二.图像编辑 pacman -S ...