重建二叉树

时间限制: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. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)

    理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...

  2. 【javascript激增的思考01】模块化编程

    前言 之前我做过一个web app(原来可以这么叫啦),在一个页面上有很多小窗口,每个小窗口都是独立的应用,比如: ① 我们一个小窗口数据来源是腾讯微博,需要形成腾讯微博app小窗口 ② 我们一个小窗 ...

  3. 强大的JavaScript动画图形库mo.js

    最近在学习前端动画方面知识时发现了挺有趣的一个动画的图形库mo.js,页面效果真是酷炫,有兴趣的同学可以研究下:). 酷炫的效果: 以下是官方的demo效果,更多详情请查看 mo.js http:// ...

  4. CORS(跨域资源共享)

    前言:上一篇文章在写如何使用JSONP实现跨域请求的时候,偶然间提到CORS,即Cross-Origin Resource Sharing(跨域资源共享).虽然前些天也看了一下CORS相关的文章,但是 ...

  5. atitit.身份认证解决方案attilax总结

    atitit.身份认证解决方案attilax总结 1.1. 身份认证1 1.2.  basic认证1 1.2.1. 编程实现basic客户端2 1.3. digest认证机制3 1.4. SSL认证3 ...

  6. Swift中的部分更新与旧版的区别

    1. 函数中的外部变量名取消 “#”方式,仅能用直接命名方式 错误 func swift(#str :NSString){} 正确 func swift(str str :NSString){} 2. ...

  7. webpack入门和实战(一):webpack配置及技巧

    一.全面理解webpack 1.什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都 ...

  8. openstack security group and rules python api use

    nova和neutron都可以,但是感觉还是用neutron好. import neutronclient.v2_0.client as neclient neutron = neclient.Cli ...

  9. 2014.1.23 Discuz论坛迁移+VPS配置手记

    虽说这也不是我第一次转移这个论坛了,但毕竟还是第一次自己配置VPS,写点东西记一下 一:关于VPS的配置 1.用TeamViewer连接服务器 这个VPS的IDC自己带有一个远程控制的页面,用浏览器打 ...

  10. ORACLE关于索引是否需要定期重建争论的整理

    ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网 ...