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的更多相关文章

  1. hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java ...

  2. Tree Traversals

    Tree Traversals 原题链接 常见的二叉树遍历的题目,根据后序遍历和中序遍历求层次遍历. 通过后序遍历和中序遍历建立起一棵二叉树,然后层序遍历一下,主要难点在于树的建立,通过中序遍历和后序 ...

  3. HDU 1710 二叉树的遍历 Binary Tree Traversals

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. hdu1710(Binary Tree Traversals)(二叉树遍历)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. HDU-1701 Binary Tree Traversals

    http://acm.hdu.edu.cn/showproblem.php?pid=1710 已知先序和中序遍历,求后序遍历二叉树. 思路:先递归建树的过程,后后序遍历. Binary Tree Tr ...

  6. 03-树2. Tree Traversals Again (25)

    03-树2. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue ...

  7. HDU 1710-Binary Tree Traversals(二进制重建)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. PAT1086:Tree Traversals Again

    1086. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  9. Binary Tree Traversals(HDU1710)二叉树的简单应用

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

随机推荐

  1. C++智能指针(auto_ptr)详解

    智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足 ...

  2. 在非MFC程序中引用CString

    CString在当今软件设计界里还是小有名气的,说它是MFC中使用的最多的类一点也不过,然而在使用sdk编windows程序的时候,确不能利用CString类,只能用sdk的运行时库,比如strlen ...

  3. Object-C中emoji与json的问题

    遇到一个问题,要储存iOS键盘输出的emoji表情到MySQL,我知道用blob+utf8是可以存的.但是现在我的这张表已经太大了,不可能去改类型.所以就想把emoji表情匹配出来,替换掉,再存.但是 ...

  4. *****正则表达式匹配URL

    最近将匹配URL的正则替换了下 之前的是: ((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3 ...

  5. HDU4714+三分

    题意:给定N个点,每个点有初始位置和初始速度. 问:在哪个时刻 使得所有的点的最大距离值最小. 分析:一开始枚举两两之间的最大值,然后在最大值中求一个最小值...(WA:题意严重理解不清..) 由两点 ...

  6. Posix IPC

  7. MyBatis的动态SQL操作--查询

    查询条件不确定,需要根据情况产生SQL语法,这种情况叫动态SQL,即根据不同的情况生成不同的sql语句. 模拟一个场景,在做多条件搜索的时候,

  8. Linux下的动态连接库及其实现机制

    Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术 ...

  9. PHP微信公众平台开发1 配置接口

    1.简介 微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字.图片.语音的全方位沟通.互动. 2.通讯机制 3.注册微信公众 ...

  10. Microsoft.Data.ConnectionUI.DataConnectionDialog

    MicrosoftVisualStudio里面的资源之数据库连接配置 这个功能的实现主要是用了Microsoft.Data.ConnectionUI.dll和Microsoft.Data.Connec ...