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},中序遍历序列:{ ...
随机推荐
- inputtype
<EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...
- 实时错误 '91' :对象变量或with块变量未设置
大家这几天在做学生信息管理系统的时候,出现最多的应该就是这个问题了,“实时错误‘91’:对象变量或with块变量未设置”.如右图: 遇到这个问题,我们首先应该去参考MSDN,不过这时候MSDN似乎没有 ...
- CentOS 6.5下安装MySql 5.7
不管您按下面的方法安装成功否,请留个言,把您遇到的问题写上共勉! 包下载http://url.cn/WrNg5S 环境: 1).软硬件:E6420双核CPU,8G内存,1T硬盘 2).虚拟机下 Cen ...
- 《asp.net mvc3 高级编程》第二章 控制器
一.控制器的角色 MVC模式中的控制器(Controller)主要负责响应用户的输入,并且在响应时通常会修改模型(Model).通过这种方式,MVC模式中的控制器主要关注的是应用程序流,输入数据的处理 ...
- 关于Chrome(谷歌浏览器)对docume,准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top
对于document.compatMode,很多朋友可能都根我一样很少接触,知道他的存在却不清楚他的用途.今天在ext中看到 document.compatMode的使用,感觉这个对于我们开发兼容性的 ...
- bestcoder单调区间
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=584&pid=1006 题解:ORZ Matrix67 ht ...
- Spring ApplicationContext的事件机制
ApplicationContext的事件机制是观察者设计模式的实现,通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 ApplicationCon ...
- jQuery的选择器中的通配符[id^='code'] 【转】
JQuery 1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='cod ...
- 002 Spring Restful案例
1:工程结构 需要注意的是需要额外导入以下三个包: jackson-annotations-2.6.1.jar jackson-core-2.6.1.jar jackson-databind-2.6. ...
- 海园帮忙写的JQUERY功能,实现了我们想要的,我觉得有点屌哟~~
需求就是为了可以在WEB在线更新代码期间,如果执行时间较长的话, 就在提交按钮之后,按钮变为灰色. 同时,一个DIV里每隔两秒刷新输出. 当更新完成之后(检测文档中的关键字串),按钮变为可提交状态~~ ...