剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385

题目描写叙述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。如果输入的前序遍历和中序遍历的结果中都不含反复的数字。

比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

输入:

输入可能包括多个測试例子,对于每一个測试案例,

输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。

输入的第二行包含n个整数(当中每一个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。

输入的第三行包含n个整数(当中每一个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。

输出:

相应每一个測试案例,输出一行:

假设题目中所给的前序和中序遍历序列能构成一棵二叉树。则输出n个整数,代表二叉树的后序遍历序列。每一个元素后面都有空格。

假设题目中所给的前序和中序遍历序列不能构成一棵二叉树。则输出”No”。

例子输入:
8
1 2 4 7 3 5 6 8 
4 7 2 1 5 3 8 6
8
1 2 4 7 3 5 6 8
4 1 2 7 5 3 8 6
例子输出:
7 4 2 5 8 6 3 1 No

这个题用递归来重建二叉树,详细代码例如以下:

#include <stdio.h>
#include <stdlib.h> #define SIZE 1001 typedef struct STreeNode
{
int data;
struct STreeNode *left;
struct STreeNode *right;
}STreeNode; int ArrPre[SIZE];
int ArrMid[SIZE];
int CanBuild; int getMidPos(int vKey, int vStart, int vEnd)
{
int i;
for (i = vStart; i < vEnd; ++i)
{
if (ArrMid[i] == vKey) return i;
}
return -1;
} void createNode(STreeNode **vNode, int vData)
{
*vNode = (STreeNode *)malloc(sizeof(STreeNode));
(*vNode)->data = vData;
(*vNode)->left = NULL;
(*vNode)->right = NULL;
} void destroyNode(STreeNode **vNode)
{
(*vNode)->left = NULL;
(*vNode)->right = NULL;
free(*vNode);
} void createBinaryTree(STreeNode **vNode, int vPreIndex, int MidIndex, int vLen)
{
if (vLen == 0) return; createNode(vNode, ArrPre[vPreIndex]);
int MidPos = getMidPos(ArrPre[vPreIndex], MidIndex, MidIndex + vLen); if(MidPos == -1)
{
CanBuild = 0;
return;
} createBinaryTree(&((*vNode)->left), vPreIndex+1, MidIndex, MidPos-MidIndex);
createBinaryTree(&((*vNode)->right), vPreIndex+(MidPos-MidIndex)+1,MidPos+1, vLen-1-(MidPos-MidIndex));
} void postTravelTree(STreeNode *vNode)
{
if (vNode == NULL) return;
postTravelTree(vNode->left);
postTravelTree(vNode->right);
printf("%d ", vNode->data);
} void destroyBinaryTree(STreeNode **vNode)
{
if (*vNode == NULL) return;
destroyBinaryTree(&((*vNode)->left));
destroyBinaryTree(&((*vNode)->right));
destroyNode(vNode);
} int main()
{
int N, i;
STreeNode *Root; while (scanf("%d", &N) != EOF)
{
for (i = 0; i < N; ++i) scanf("%d", &ArrPre[i]);
for (i = 0; i < N; ++i) scanf("%d", &ArrMid[i]); CanBuild = 1;
createBinaryTree(&Root, 0, 0, N);
if (!CanBuild)
{
printf("No\n");
}
else
{
postTravelTree(Root);
printf("\n");
} destroyBinaryTree(&Root);
} return 0;
}
/**************************************************************
Problem: 1385
User:
Language: C
Result: Accepted
Time:0 ms
Memory:920 kb
****************************************************************/

027依据前序遍历和中序遍历,重建二叉树(keep it up)的更多相关文章

  1. POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)

    题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...

  2. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

  3. java编写二叉树以及前序遍历、中序遍历和后序遍历 .

    /** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...

  4. 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历

    /* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...

  5. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:    ...

  6. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  7. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

  8. 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  9. 剑指offer--(根据前序遍历和中序遍历)重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

随机推荐

  1. [Swift通天遁地]九、拔剑吧-(3)创建多种自定义Segment分段样式的控件

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. 局部覆盖element-ui的默认样式

    最近项目中遇到的问题,只想在某个页面里面单独更改element-ui的样式,而不影响全局 有两种方法: 1.在需要更改的组件里新增一个style标签[重点:不要加scoped],然后直接获取class ...

  3. python中的深拷贝和浅拷贝(面试题二)

    一.浅拷贝 定义:浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值. 浅拷贝的特点: 公用一个值: 这两个变量的内存地址一样: 对其中一个变量的值改变,另外一个变量的值也 ...

  4. UNIX环境高级编程--1

    前期准备: 下载apue3源文件(从apuebook.com上),然后编译(make)之后,得到libapue.a动态链接文件(.o 就相当于windows里的obj文件 .a 是好多个.o合在一起, ...

  5. Html学习-File控件学习

    情况一:不设置enctype HTML内容 <form action="02Upload.ashx" method="post"> <inpu ...

  6. Java多线程——线程八锁案例分析

    Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...

  7. oracle 外部表及解决ora-29400,ora-29913错误

    对外部表的理解及测试,,,,如有理解不正确请大家指正 语法: create table 表名( 列名1,列名2,...... ) organization external  ###说明创建外部表 ( ...

  8. 使用FastReport的BarCode2D控件生成含中文的PDF417条形码

    解决方法:设定CodePage为936 FastReport用户手册中关于CodePage的说明: CodePage This property is specific to the PDF417 a ...

  9. java网络

    title: java 网络 date: 2017年3月11日11:14:52 1. 复杂的东西就把他封装成对象 概述:(网络就是找到别人) 找到对方的机器,(找到对方的ip地址) 每个机器中有很多进 ...

  10. CAD实现自定义实体夹点移动(com接口VB语言)

    主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::moveGripPointsAt 自定义实体事件,自定义实体夹点被移动,详细说明如下: 参数 说明 ...