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

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

 #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. Linux硬盘命名和安装分区

    硬盘命名: 硬盘命名基于文件,一般有如下文件方式: /dev/hda1 /dev/sdb3 具体含义如下: /dev:是所有设备文件存放的目录. hd和sd:他们是区别的前两个字母,代表该分区所在的设 ...

  2. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  3. 修改本地数据库root权限密码

    方法1: 用SET PASSWORD命令 测试成功 首先登录MySQL @1——mysql DOS 窗口中. 格式:mysql> set password for 用户名@localhost = ...

  4. 百度地图api窗口信息自定义

    百度地图加载完后,完全可以用dom方法操作,比较常用的就是点击mark的弹窗,利用jQuery可以很快的创建弹窗,需要注意的就是地图都是异步加载,所以绑定时间要用 jQuery 事件 - delega ...

  5. 栈的讲解 和 栈的生长方向 源代码技巧分析,简直没SEI 啦

    函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以战舰stm32开发板为例,在startup_stm32f1 ...

  6. SVN客户端忽略无关文件-备

    修改前请先备份文件 ~/.subversion/config. 1,打开Terminal,输入命令: $ open ~/.subversion/config   2,在打开的文件中寻找:`global ...

  7. poj 3026Borg Maze

    http://poj.org/problem?id=3026 #include<cstdio> #include<iostream> #include<cstring&g ...

  8. -_-#【React】

    React Native 用于构建用户界面的JAVASCRIPT库 | ReactReact 入门实例教程颠覆式前端UI开发框架:Reactzhihu1zhihu2 React.js编程思想 < ...

  9. (转载)PHP mb_substr函数在实际编码中的应用方法

    (转载)http://developer.51cto.com/art/200912/166080.htm 我们在使用PHP语言进行实际编码中时,通常会遇到许多错误的出现,比如在截取字符串时会出现乱码等 ...

  10. cf701B Cells Not Under Attack

    Vasya has the square chessboard of size n × n and m rooks. Initially the chessboard is empty. Vasya ...