重建二叉树

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。

输入

输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。

输出

每组输出数据单独占一行,输出对应得先序序列。

样例输入

ACBFGED ABCDEFG

CDAB CBAD

样例输出

DBACEGF

BCAD

 //从后序中找到根(最后一个结点),然后确定根在中序中的位置,从而可以将中序序列分为左右子序列,后序中按此左序列的长度确定的序列即为后序左序列,

//后序中剩下的序列去掉根即为后序右序列,递归建树,然后NLR遍历

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node{
char data;
struct node *lchild,*rchild;
}BitNode,*BiTree;
void GetPreorder(char *last,char *mid,BiTree &T,int len)
{
if(!len)
{
T = NULL;
return;
}
char ch = last[len-];//得到根结点
int index = ;//索引记录根结点在中序中的位置
while(mid[index] != ch) index ++;
T = (BiTree)malloc(sizeof(BitNode));//为根结点开辟空间
T->data = ch;
//递归建立左子树和右子树
GetPreorder(last,mid,T->lchild,index);
GetPreorder(last+index,mid+index+,T->rchild,len-index-);
}
void Preorder(BiTree T)
{
if(T)
{
putchar(T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
int main()
{
char mid[],last[];
while(scanf("%s%s",last,mid) != EOF)
{
BiTree T;
GetPreorder(last,mid,T,strlen(mid));//last,mid接收字符串后系统自动加'\0'
Preorder(T);
puts("");
}
return ;
}

//非递归输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 26 typedef struct node{
char ch;
struct node *lchild,*rchild;
}BitNode,*BiTree; typedef struct sqstack{
int top;
BitNode* ch[MAXSIZE];//数组中每个元素都是树中结点指针
}Sqstack; void GetPreorder(char *post,char *mid,BiTree &T,int len)
{
if(!len)
{
T = NULL;
return;
}
int index = strchr(mid,post[len-]) - mid;
T = (BitNode *)malloc(sizeof(BitNode));
T->ch = post[len-];
GetPreorder(post,mid,T->lchild,index);
GetPreorder(post+index,mid+index+,T->rchild,len-index-);
} void IniStack(Sqstack &S)
{
S.top = -;
} int IsEmpty(Sqstack S)
{
if(S.top == -) return ;
else return ;
} void Push(Sqstack &S,BiTree T)
{
S.ch[++S.top] = T;
} void Pop(Sqstack &S,BiTree &T)
{
T = S.ch[S.top--];
} void Preorder(BiTree T)
{
Sqstack S;
IniStack(S);
while(T || !IsEmpty(S))
{
if(T)
{
putchar(T->ch);//visit
Push(S,T);
T = T->lchild;
}
else{
Pop(S,T);
T = T->rchild;
}
}
} int main()
{
char post[],mid[];
while(scanf("%s%s",post,mid) != EOF)
{
BiTree T;
GetPreorder(post,mid,T,(int)strlen(post));
Preorder(T);//非递归
puts("");
}
return ;
}

//不建树直接输出前序序列

//author:1495457

#include <stdio.h>
#include <string.h>
void preorder(char *post,char *mid,int len)
{
if(!len) return;
putchar(post[len-]);
int index = strchr(mid,post[len-]) - mid;//strchr:在一个串中查找给定字符的第一个匹配之处
preorder(post,mid,index);
preorder(post+index,mid+index+,len-index-);
}
int main()
{
char post[],mid[];
while(scanf("%s%s",post,mid) != EOF)
{
preorder(post,mid,strlen(post));
puts("");
}
}

补充:如果已知前序、中序,求后序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node{
char data;
struct node *lchild,*rchild;
}BitNode,*BiTree;
void GetPostorder(char *pre,char *mid,BiTree &T,int len)
{
if(!len)
{
T = NULL;
return;
}
char ch = pre[];//得到根结点
int index = ;//索引记录根结点在中序中的位置
while(mid[index] != ch) index ++;
T = (BiTree)malloc(sizeof(BitNode));//为根结点开辟空间
T->data = ch;
//递归建立左子树和右子树
GetPostorder(pre+,mid,T->lchild,index);
GetPostorder(pre+index+,mid+index+,T->rchild,len-index-);
}
void Postorder(BiTree T)
{
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
putchar(T->data);
}
}
int main()
{
char pre[],mid[];
while(scanf("%s%s",pre,mid) != EOF)
{
BiTree T;
GetPostorder(pre,mid,T,strlen(pre));
Postorder(T);
puts("");
}
return ;
}
//前、中
//DBACEGF ABCDEFG ACBFGED
//ABCDEFG BCDAGFE DCBGFEA

参照:http://www.tuicool.com/articles/jaiAVj

2016-07-06

NYOJ-756重建二叉树的更多相关文章

  1. nyoj 756 重建二叉树

    重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须 ...

  2. NYOJ 756 重建二叉树 (二叉树)

    题目链接 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开 ...

  3. nyist oj 756 重建二叉树

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 题目非常easy.给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组 ...

  4. C++版-剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告

    剑指offer 重建二叉树 提交网址: http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tq ...

  5. 重建二叉树_C++

    一.题目背景 给定一个二叉树的前序和中序遍历,求出它的后序遍历 二叉树的遍历可参考 http://blog.csdn.net/fansongy/article/details/6798278/ 二.算 ...

  6. 剑指Offer面试题:5.重建二叉树

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

  7. 剑指Offer 通过中序和先序遍历重建二叉树

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

  8. nyoj756_重建二叉树_先序遍历

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!).   输入 输入有多组数 ...

  9. 剑指offer 面试题6:重建二叉树

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

随机推荐

  1. Objective-C instancetype关键字

     instancetype是clang 3.5开始,clang提供的一个关键字 表示某个方法返回的未知类型的Objective-C对象 instancetype会告诉编译器当前的类型,这点和NSObj ...

  2. 如何对sharepoint图片库的文件夹的图片按照时间排序并分页显示

    /// <summary> /// 获取图片库第一层文件夹--根据文件夹名称排序 /// </summary> /// <param name="siteUrl ...

  3. 关于JNI的使用方法

    1首先在java里面定义你需要的native方法 2打开cmd,进入doc窗口,如果是android项目就进入到你当前项目的bin目录下,在doc里面输入cd E:\workspace\Test1 也 ...

  4. 我的第一节Android课

    我的第一节安卓课程,今天非比寻常的一天,我开始了我程序猿之路的第一节安卓课程,安卓课程只是我的一个兴趣班,我的本专业是java开发,因为喜欢做一个属于自己的一个手机APP,就选多个一样技能,毕竟十八般 ...

  5. 最新GHOST XP系统安全稳定版 V2016年

    来自系统妈:http://www.xitongma.com 电脑公司GHOST xp系统经典优化版 V2016年4月 系统概述 电脑公司ghost xp系统经典优化版集成最常用的装机软件,集成最全面的 ...

  6. xcode中info.plist文件相关问题

    <一>关于提示http://访问网络不安全的解决方法 提示错误: App Transport Security has blocked a cleartext HTTP (http://) ...

  7. 转载:检测到有潜在危险的 Request.Form 值

    转载:检测到有潜在危险的 Request.Form 值 金刚 ASP.NET Request.Form 这是一篇转载的文章,文章原始出处.点我 这种问题是因为你提交的Form中有HTML字符串,例如你 ...

  8. Ubuntu/Windows双系统修复引导

    Ubuntu/Windows双系统修复引导   首先说明:在Windows存在的前提下安装Ubuntu(或者Ubuntu系列)是不需要修复引导的.因为grub会自动搜索存在硬盘中的系统.   而在Ub ...

  9. servlet 学习(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  10. SQL Server 2012实施与管理实战指南(笔记)——Ch3Alwayson可用组

    3.AlwaysOn可用组 Alwayson支持的,是一个可用性组,每个可用性组是包含了多个用户数据库的容器,可用性组内的数据库可以作为一个整体进行故障转移. AlwaysOn关键特性: 一.类似集群 ...