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. JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet

    一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...

  2. 将 Qt 5.6 集成至 VS2015

    摘要: 由于VS2015不再支持addin,所以要用其他手段. 这里给出64位系统下的安装步骤,32位类似. 一.安装VS2015 过程略.值得注意的是要选择需要安装的内容,既然要用Qt,那么C++相 ...

  3. node.js模块之Buffer模块

    http://nodejs.org/api/buffer.html Pure JavaScript is Unicode friendly but not nice to binary data. W ...

  4. android 页面滑动 ViewFlipper,OnGestureListener,OnTouchListener

    public class Main extends Activity implements OnGestureListener, OnTouchListener { // 一般不直接使用ViewAni ...

  5. 【HDOJ】4297 One and One Story

    综合性很强的题目.存在环,可以用tarjan处理,然后需要求LCA.并查集+RMQ可以搞.非常不错的题目. /* 4297 */ #include <iostream> #include ...

  6. Android开发之AIDL的使用一--跨应用启动Service

    启动其他App的服务,跨进程启动服务. 与启动本应用的Service一样,使用startService(intent)方法 不同的是intent需要携带的内容不同,需要使用intent的setComp ...

  7. WPF中映射clr namspace

    1. xaml中直接映射为prefix xmlns:prefix="clr-namespace:MyApplication.Modules.Entity;assembly=MyAssembl ...

  8. Git版本控制使用介绍

    Git是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git与SVN的最主要的区别? Git是分布式的,SVN不是 Git没有一个全局的版本号,而SVN有 ...

  9. unity3d游戏开发 —— 倒计时

    using UnityEngine;using System.Collections; public class CoolTime : MonoBehaviour { // Use this for ...

  10. OWIN katana注册中间件的几种写法

    首先特别说明下在startup中注册完中间件的两个注意事项,看到有人写的东西有误导人的作用.关于startup启动发现类的内容,参照这里 http://www.asp.net/aspnet/overv ...