重建二叉树

时间限制: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. Subway Icon Set – 306个像素完美的特制图标

    这个图标集是306个优化的像素完美,精雕细琢的图标.为这些设备进行了优化:iOS.Windows Phone.Windows 8 and BlackBerry 10,提供 PNG, SVG, XALM ...

  2. 前端上传组件Plupload使用指南

    我之前写过一篇文章<文件上传利器SWFUpload使用指南>,里面介绍了上传组件SWFUpload的使用方法,但现在随着html5技术的逐渐推广和普及,再去使用以flash为上传手段的SW ...

  3. FlippingBook使用教程

    FlippingBook是一款收费的图书翻页效果的flash播放器.在线预览地址:FlippingBook,破解版下载地址 备用下载地址 预览效果: 它的文件结构如下: 其中:css文件夹是一个简单的 ...

  4. 关于内存泄露分析插件 MAT 的用法

    关于内存泄露分析插件 MAT 的用法,建议大家有时间看一下,下面的文章 http://www.blogjava.net/rosen/archive/2010/05/21/321575.html htt ...

  5. PPT产品的重要性

    客户需求:减轻现场工作量,不能因为上了运维管理系统以后,工作量反而增加了,因此流程需要简化,除了需要符合国家安全规定的,其余流程都简化. 项目背景:当前算是处于POC阶段,给客户的项目经理展示我们的运 ...

  6. 退出多个activity的方法

    1.使用List集合方式 用list保存activity实例,然后逐一干掉 import java.util.LinkedList; import java.util.List; import and ...

  7. C语言笔记

    .c是C语言源文件,在编写代码的时候创建 .o是目标文件,在编译成功的时候产生  .obj .out是可执行文件,在链接成功的时候产生 工具:clang编译器(Xcode3 gcc Xcode4 LL ...

  8. 重置svn地址

    TortoiseSVN->relocate  更改svn地址

  9. php鼠标滚动加载

    http://www.thinkphp.cn/extend/772.html 滚动距离js判断 i = 1; //设置当前页数 $(function() { var totalpage = 6; // ...

  10. 世道变了 – 你愿意成为微软认证Linux工程师吗?

     随笔世道变了 – 你愿意成为微软认证Linux工程师吗? 世道变了 – 你愿意成为微软认证Linux工程师吗?  leixu十二月 14, 2015随笔 2015年12月9日,微软发布了全新的MCS ...