nyoj 756 重建二叉树
重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须要有中序遍历,求这样的问题主要有两种方式,一种是把树建立起来,然后在遍历就行了,还有一种常用的方式是不用建树直接遍历。
第一种方式: 建立二叉树,然后进行遍历
#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct Node{
char data;
struct Node *lchild, *rchild;
}Node, *PNode; void buildTree(PNode *root, char *post, char *in, int len)/*root表示根节点,
post表示后序遍历的结果,in表示中序遍历的结果,len表示当前子树的长度*/
{
if(len == )
{
*root = NULL;
return;
}
PNode node = (PNode)malloc(sizeof(Node));
node->data = post[len - ];
node->lchild = node->rchild = NULL;
*root = node;
char *ptr = strchr(in, node->data);//找到根节点在中序遍历中的位置
int leftlen = strlen(in) - strlen(ptr);//左子树的长度
int rightlen = len - leftlen - ;//右子树的长度
buildTree(&(*root)->lchild, post, in, leftlen);//递归建左子树
buildTree(&(*root)->rchild, post + leftlen, ptr + , rightlen);//递归建立右子树
} void preOrderTraverse(PNode root)//前序遍历
{
if(root == NULL)
return ;
printf("%c", root->data);
preOrderTraverse(root->lchild);
preOrderTraverse(root->rchild);
}
int main()
{
char post[], in[];
while(scanf("%s %s", post, in) != EOF)
{
PNode root = NULL;
buildTree(&root, post, in, strlen(in));
preOrderTraverse(root);
printf("\n");
}
return ;
}
第二种方式: 不建立二叉树,直接遍历
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//这里是不建树的方式,代码比较简洁
//post代表后序遍历的结果, in代表中序遍历的结果,ans存放前序遍历的结果, n是当前节点的个数
void Traverse(int n, char *post, char *in, char *ans)
{
if(n <= )
return;
int p = strchr(in, post[n - ]) - in;/*因为后序的最后一个是当前子树的根节点,
所以找到根节点在中序遍历中的位置 让它减去in获得它在中序遍历中的位置 */ Traverse(p, post, in, ans + );/*递归它的左子树,左子树的长度为p,
后序的开始位置为还是为post,中序的开始位置也是一样,把保存前序的数组加一 */ Traverse(n - p - , post + p, in + p + , ans + p + );/*递归它的右子树,
其中后序的开始位置就是post+p,因为后续的根节点在最后,所以不用加一,但是中序的要加一,因为中间有个根节点要跳过它,ans当然是+p+1了*/
ans[] = post[n - ];//将当前子树的根节点赋值给ans,
}
int main()
{
char str1[], str2[];
while(scanf("%s %s", str1, str2) != EOF)
{
char ans[];
int len = strlen(str2);
Traverse(len, str1, str2, ans);
ans[len] = '\0';
puts(ans);
}
return ;
}
下面这个是已知前序和中序求后续, 建树的比较简单, 下面是不建树的方法:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//这里不建树, 直接将其后序保存到数组ans中
void buildTree(int n, char *preOder, char *inOrder, char *ans)
{
if(n <= )
return;
int p = strchr(inOrder, preOder[]) - inOrder;
buildTree(p, preOder + , inOrder, ans);
buildTree(n - p - , preOder + p + , inOrder + p + , ans + p);
ans[n - ] = preOder[];//由于是后序,所以n - 1, preOrder[0]为根节点
}
int main()
{
char str1[], str2[];
while(scanf("%s %s", str1, str2) != EOF)
{
char ans[];
int len = strlen(str2);
buildTree(len, str1, str2, ans);
ans[len] = '\0';
puts(ans);
}
return ;
}
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}和中序 ...
- NYOJ-756重建二叉树
重建二叉树 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于 ...
- 剑指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},中序遍历序列:{ ...
随机推荐
- locate 不能使用
当需要查找一个文件,只知道文件名不知道路径,我们通常用locate,由于公司的服务器使用最小化安装的所以当locate 文件名,报错,提 示-bash: locate: command not fou ...
- eclipse 编辑 python 中文乱码的解决方案
今天在学习python时做了一个用户输入一个目录地址,再输入内容,然后将输入的内容存入输入的目录文件中: 具体代码如下: #coding:utf- ''' Created on -- @author: ...
- Django - staticfiles,STATIC_ROOT, STATIC_URL,STATICFILES_DIRS
staticfiles:这是一个静态资源管理的app,django.contrib.staticfiles.老的版本中,静态资源管理一直是一个问题,部分app发布的时候需要带上静态资源,在部署的时候必 ...
- SPSS与聚类分析
1.进行K均值聚类分析时需要线标准化处理,抛弃量纲差异,比如说数值型变量有的以千记有的以百分数记.2.层次聚类就是先把每个样本都看成一个独立的类:聚类特征(Clustering Feature, CF ...
- poj 2777Count Color
http://poj.org/problem?id=2777 注意:a可能比b大 #include <cstdio> #include <cstring> #include & ...
- BZOJ 3065 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 思路:替罪羊树套权值线段树. 当替罪羊树某个子树大于某个比利(比例)时就暴力重构,本题时间复杂 ...
- Qt中添加背景图片的方法
工作似乎走上正轨了,上周五的工作是做一个界面,用到QFrame和QPushButton,QFrame做主面板,QPushButton为其子控件,需要在主面板上贴背景图片,还需要在QPushButton ...
- 怎样把.git版本控制文件夹放在项目目录下
在上传本地代码到本地git库时,.git的存放目录不能放到项目根目录下(报错). 可以先把.git仓库选择其他保存路径,然后再copy到项目根目录下.
- CSS里的 no-repeat 是什么意思
CSS里的 no-repeat是针对背景图片来说的.当你设置了no-repeat这个属性后,你的背景图片将不会被重复,再换一种说法,你在网站上所看到的背景图片就是你所添加的图片, 不会出现平铺或者重复 ...
- <一>初探js特效魅力之选项卡05
初探js特效魅力05 接下来为大家介绍的选项卡的切换 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...