NYOJ-756重建二叉树
重建二叉树
时间限制: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重建二叉树的更多相关文章
- nyoj 756 重建二叉树
重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须 ...
- NYOJ 756 重建二叉树 (二叉树)
题目链接 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开 ...
- nyist oj 756 重建二叉树
重建二叉树 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 题目非常easy.给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组 ...
- C++版-剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告
剑指offer 重建二叉树 提交网址: http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tq ...
- 重建二叉树_C++
一.题目背景 给定一个二叉树的前序和中序遍历,求出它的后序遍历 二叉树的遍历可参考 http://blog.csdn.net/fansongy/article/details/6798278/ 二.算 ...
- 剑指Offer面试题:5.重建二叉树
一.题目:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序 ...
- 剑指Offer 通过中序和先序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- nyoj756_重建二叉树_先序遍历
重建二叉树 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数 ...
- 剑指offer 面试题6:重建二叉树
重建二叉树 题目 输入某二叉树的前序遍历和中序遍历,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含有重复的数字. 例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{ ...
随机推荐
- [deviceone开发]-do_RichLabel的简单示例
一.简介 do_RichLabel支持html格式的文本内容,但是只支持部分标签,这个示例列出了一些支持的常用标签,android能支持的标签相对ios更少 二.效果图 三.相关下载 https:// ...
- 1分钟实现Autodesk Vault登录对话框
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courie ...
- iOS开发之动画中的时间
概述 在动画中,我们会指定动画的持续时间.例如 scaleAnimation.duration = self.config.appearDuration 那么这个时间是怎么定义的呢?是指的绝对时间吗? ...
- NSFileHandle
/* 文件处理句柄要完成的工作: 相当于C中的文件操作,诸如 打开,读,写,关闭,修改文件偏移量等行为 类名: NSFileHandle 注意: 操作句柄时,重点把握文件的偏移量在哪个位置 重点 ...
- objective-c系列-NSMutableArray
******************************************** // 可变数组构造方法 // 下边两句的定义都是不可变的 // NSMutableArray *mar ...
- GCD的深入理解
GCD 深入理解(一) 本文由@nixzhu翻译至raywenderlich的<grand-central-dispatch-in-depth-part-1> 虽然 GCD 已经出现过一段 ...
- vs合并压缩css,js插件——Bundler & Minifier
之前做了一个大转盘的抽奖活动,因为比较火,部分用户反馈看不到页面的情况,我怀疑js加载请求过慢导致,所以今天针对之前的一个页面进行调试优化. 首先想到的是对页面的js和css进行压缩优化,百度了下vs ...
- 网站错误记录:A transport-level error has occurred when sending the request to the server.
今天查看公司项目的日志文件,发现有这个错误:A transport-level error has occurred when sending the request to the server. 感 ...
- C#语言——类
C#——类 一.String 类 系统内置的处理字符串类型的函数方法类.方便我们对字符串类型进行一系列的处理. 1.Length:获取字符串的长度,返回一个int类型的值 string x=Conso ...
- mod_PHP&fastcgi
从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果. 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回 ...