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},中序遍历序列:{ ...
随机推荐
- 【COGS1049】天空中的繁星
[题目背景] 第二届『Citric』杯NOIP提高组模拟赛 第二题 [题目描述] Lemon最近买了一台数码相机.某天Lemon很无聊,于是对着夜空拍了一张照片,然后把照片导入了电脑.Lemon想依靠 ...
- 13 Roman to Integer(罗马数字转int Easy)
题目意思:罗马数字转int 思路:字符串从最后一位开始读,IV:+5-1 class Solution { public: int romanToInt(string s) { map<char ...
- mybatis中association的column传入多个参数值
顾名思义,association是联合查询. 在使用association中一定要注意几个问题.文笔不好,白话文描述一下. 1: <association property="fncg ...
- Ecshop 数据库操作方法getRow、getAll、getOne区别
ECShop没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,大大减小了分发包的文件大小.另外,当网站需要做memcached缓存时,也可以 ...
- PS抠图神器:KNOCKOUT 2.0
从优设上转载~~太好用了,保存下来以备不时之需. 本人亲身实践~~先看使用成果~~哈哈~~ 原版图 : 抠过的图: 主要看飘逸的发丝~~~而且全程操作不超过5分钟!! 下载地址: http://vdi ...
- 教你怎样在ppt2010抠图的小技巧|用ppt2010抠图的方法
我们经常在ppt2010里做幻灯片时会碰到插入的图片并不是我们想要的情况,有的图片只是想要其中的一个部分.我们用“裁剪”功能也是达不到自己想要的效果.有的人会说PS抠图啊,但是比较繁琐,不易懂,不好上 ...
- 简化的nginx多进程模型demo
//version 1:以下代码仅演示nginx多进程模型[test@vm c]$ cat mynginx.c#include <stdio.h> #include <string. ...
- 在CentOS6上使用YUM安装Mysql5.5.x
1.安装MySQL 5.5.x的yum源: rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm 2.安装MySQL客户端的支持包: yu ...
- js方法在iframe父子窗口
http://developer.51cto.com/art/201009/228891.htm http://developer.51cto.com/art/201009/228891.htm ht ...
- keil c编译器错误与解决方法
1. Warning 280:’i’:unreferenced local variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告 2 Warning 206:’ ...