重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须要有中序遍历,求这样的问题主要有两种方式,一种是把树建立起来,然后在遍历就行了,还有一种常用的方式是不用建树直接遍历。

第一种方式: 建立二叉树,然后进行遍历

 #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 重建二叉树的更多相关文章

  1. NYOJ 756 重建二叉树 (二叉树)

    题目链接 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开 ...

  2. nyist oj 756 重建二叉树

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 题目非常easy.给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组 ...

  3. C++版-剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告

    剑指offer 重建二叉树 提交网址: http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tq ...

  4. 重建二叉树_C++

    一.题目背景 给定一个二叉树的前序和中序遍历,求出它的后序遍历 二叉树的遍历可参考 http://blog.csdn.net/fansongy/article/details/6798278/ 二.算 ...

  5. 剑指Offer面试题:5.重建二叉树

    一.题目:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序 ...

  6. NYOJ-756重建二叉树

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于 ...

  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. jQuery获取select、checkbox、radio的方法总结

    在进行网页的前后台交互的时候,经常需要获取单选框(radio).复选框(checkbox)以及下拉列表(select/dropdownlist)选中的值. 总结了一下,方便以后复习查看: 1.获取选中 ...

  2. 关于highcharts(功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库)

    官网http://www.hcharts.cn/ 引入下列文件 <script type="text/javascript" src="http://cdn.hch ...

  3. .NET,你真的 知道了吗

    搞清自己是干什么的 有人问你是做什么的,回答是:"我是做,NET开发的",有的人也会问:"那.NER.是什么?"刚开始我认为是一个开打工具,后认为是一个平台,一 ...

  4. jQuery 如何创建基本插件(翻译)

    有时候,你希望有一块功能在整个代码当中都可以使用.例如,你可能想要有一个单一的方法可以在jQuery选择器上进行调用,用于处理该选择器上的一系列操作.又或许你编写了一个十分有用的工具函数,并希望能够简 ...

  5. JS判断鼠标从哪个方向进入DIV容器

    写的不够高大上 , 不要介意哦... Js: //进去 $(".flash").bind("mouseenter",function(e){ /** the w ...

  6. phalcon的一些中文手册和帮助文档地址收集

    1:中文官方网站:http://phalconphp.com/zh/ 挺好可以好好看文档 可安装http://bullsoft.org/phalcon-docs/这个去查找,这是个部分中文的手册! P ...

  7. Python学习笔记:03语法

    Python 语法 Python语法包括: 模块函数导入 赋值 判断循环语句 模块导入 import somemodule somemodule.somefunc from somemodule im ...

  8. C语言:Message类

    message.h #ifndef MESSAGE_H #define MESSAGE_H #define TRUE 1 #define FALSE 0 typedef struct { int se ...

  9. 手机控制电脑,在WIFI局域网下(关机,重启,遥控)

    这个软件叫百变遥控:http://blog.sina.com.cn/s/blog_9abc7dbc0101hmut.html 今天周末,在家里看电影,家里用的是台式电脑,我自己买了一个投影仪来专门看视 ...

  10. 转:精心挑选的12款优秀 jQuery Ajax 分页插件和教程

    在这篇文章中,我为大家收集了12个基于 jQuery 框架的 Ajax 分页插件,这些插件都提供了详细的使用教程和演示.Ajax 技术的出现使得 Web 项目的用户体验有了极大的提高,如今借助优秀的  ...