027依据前序遍历和中序遍历,重建二叉树(keep it up)
剑指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)的更多相关文章
- POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)
题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...
- lintcode :前序遍历和中序遍历树构造二叉树
解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
- 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历
/* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...
- LintCode-73.前序遍历和中序遍历树构造二叉树
前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: ...
- HDU1710---树(知前序遍历与中序遍历 求后序遍历)
知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...
- 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer--(根据前序遍历和中序遍历)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
随机推荐
- 多个@bean无法通过@resource注入对应的bean(org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found )
一.异常 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ' ...
- Akka源码分析-官方文档说明
如果有小伙伴在看官方文档的时候,发现有些自相矛盾的地方,不要怀疑,可能是官方文档写错了或写的不清楚,毕竟它只能是把大部分情况描述清楚.开源代码一直在更新,官方文档有没有更新就不知道了,特别是那些官方不 ...
- 331 Verify Preorder Serialization of a Binary Tree 验证二叉树的前序序列化
序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录这个节点的值.如果它是一个空节点,我们可以使用一个标记值,例如 #. _9_ / \ 3 2 ...
- tp5.0分页样式调控
基础的分页调用 /** * 控制器部分代码 */ //实例化模型 $areasModel=new Areas(); //分页数据集 $listarea=$areasModel->paginate ...
- C#入门经典 Chapter5 变量的更多内容
5.1类型转换 1.类型转换 1.1隐式转换:所有情况下可进行,编译器执行转换. 1.2显示转换 强制转换:强迫数据从一种类型转换为另一种类型. (<destinationType>)&l ...
- C# 学习——静态(第四天)
一.命名空间 类似于文件夹,而类就是文件夹中的文件: 作用:明确的指向我们所需要的类的 所在的位置: 统一命名空间下,类名不能重复. 二.类 概念:具有相同属性和功能的对象的抽象的集合. 三.静态与实 ...
- Android Studio 快捷键整理
Alt+回车 导入包,自动修正 Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...
- ubuntu.16.04 安装.net core记录
jack@ubuntu:~$ sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotne ...
- Java中字符串的常用属性与方法
•字符串常用的属性 string.length()————>返回字符串的长度,int类型. •字符串常用的方法 String.contains(";")——————>判 ...
- 洛谷——P1613 跑路
P1613 跑路 题目大意: 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B ...