#include <stdio.h>
#include <stdlib.h>/*二叉树结构体*/
typedef struct Tree{int data;struct Tree *leftTree;struct Tree *rightTree;
}Tree;
/*序列结构体*/
typedef struct List{int data[10];int size;
}List;
/*
返回值:重建的二叉树的根节点
参数:前序序列结构体中序序列结构体
*/
Tree * rebuildTree(List *preList,List *midList)
{/*判断*/if(midList->size == 0)   return NULL;/*创建根节点*/Tree *root = NULL;// BiTree root = NULL;if(preList->size != 0){/*跟节点初始化*/// root = (Tree *)malloc(sizeof(Tree));root = (Tree *)malloc(sizeof(Tree));/*前序序列的第一个元素是 新的 二叉树的跟节点*/root->data = preList->data[0];}int i=0,j=0;int father=0;/*根节点在中序序列的位置  用于 左子树集合 和 右子树集合 的确定*/for(i=0;i<midList->size;i++){if(midList->data[i] == preList->data[0]){father = i;break;}}/*分别定义存放 前序序列 和 中序序列 的 左子树集合 和 右子树集合 的 结构体变量*/List pre_left,pre_right,mid_left,mid_right;/*初始化*/pre_left.size = pre_right.size = mid_left.size = mid_right.size = 0;/*根据变量i(根节点在中序节点的位置),给前序节点和中序交接点的 左子树集合 赋值*/for(i=0;i<father;i++){/*preList[0]为根节点,所以加一*/pre_left.data[i] = preList->data[i+1];pre_left.size++;mid_left.data[i] = midList->data[i];mid_left.size++;}/*给前序节点和中序交接点的 右子树集合 赋值*/for(i=father+1,j=0;i<midList->size;i++,j++){pre_right.data[j] = preList->data[i];pre_right.size++;mid_right.data[j] = midList->data[i];mid_right.size++;}/*递归调用将左子树看成完整的一棵树找出根结点作为主根结点的左子树*//*注意是  root->leftTree =  */root->leftTree = rebuildTree(&pre_left,&mid_left);/*递归调用将右子树看成完整的一棵树找出根结点作为主根结点的右子树*//*注意是 root->rightTree */root->rightTree = rebuildTree(&pre_right,&mid_right);return root;
}
/*先序递归遍历*/
void pre_travel(Tree *tree)
{if(tree)        /*如果节点不为空,就进入*/{printf("%d   ",tree->data);pre_travel(tree->leftTree);pre_travel(tree->rightTree);}
}
/*中序遍历*/
void mid_travel(Tree *tree)
{if(tree){mid_travel(tree->leftTree);printf("%d   ",tree->data);mid_travel(tree->rightTree);}
}int main(void)
{Tree *tree;List preList;List midList;preList.size = 0;midList.size = 0;int i=0,num=0;printf("请输入共有多少个结点:\n");scanf("%d", &num);printf("请输入先序序列:\n");/*创建前序序列*/for (i = 0; i < num; i++){scanf("%d",&preList.data[i]);preList.size++;}/*创建中序序列*/printf("请输入中序序列:\n");for (i = 0; i < num; i++){scanf(" %d", &midList.data[i]);midList.size++;}/*调用重建二叉树函数*/tree = rebuildTree(&preList,&midList);/*前序遍历*/pre_travel(tree);/*中序遍历*/mid_travel(tree);return 0;
}

重建二叉树 (C语言)相关推荐

  1. 先序中序后序两两结合重建二叉树

    遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次.由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转 ...

  2. 前序遍历+中序遍历重建二叉树

    文章目录 题目 AC代码 题目 本题链接:剑指 Offer 07. 重建二叉树 注:链接题目仅代表和本题大体相似 因为是考研笔试,本题代码以C语言去写 AC代码 代码解释:本题要求就是给定两个序列:分 ...

  3. 剑指offer第7题 重建二叉树

    前言 该系列文章为本人刷leetcode的记录,主要旨在分享刷题的思路及算法解析(尽可能的一题多解),另方便自己日后查阅回顾.代码的实现语言是python和go. 想进大厂免不了刷题,一起加油吧,小伙 ...

  4. 剑指offer:面试题07. 重建二叉树

    题目: 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...

  5. 根据二叉树的前序遍历和中序遍历重建二叉树

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

  6. 剑指offer_第4题_重建二叉树

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

  7. python根据二叉树的前序遍历和中序遍结果历重建二叉树

    python根据二叉树的前序遍历和中序遍结果历重建二叉树 前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: ( ...

  8. 《编程之美》读书笔记19: 3.9 重建二叉树

    <编程之美>读书笔记19: 3.9 重建二叉树 对根节点a以及先序遍历次序P和中序遍历次序I,查找a在I中的位置,将I分为两部分,左边部分的元素都在a的左子树上,右边的元素都在a的右子树上 ...

  9. 剑指Offer系列 重建二叉树

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

最新文章

  1. mysql子查询设置_什么是mysql子查询?如何利用子查询进行过滤?
  2. Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)
  3. 键盘跟计算机无法识别,键盘无法识别的原因与解决办法
  4. 面试:一文搞懂 final 关键字的作用
  5. (秋季)秋天海报设计素材模板
  6. 删数问题 山东理工oj2072(贪心)
  7. ez-ipupdate的移植
  8. 百度云安装WordPress,提示数据库连接错误!
  9. Raki的NLP竞赛topline解读:NBME - Score Clinical Patient Notes
  10. zfs文件服务器上传失败,解决 ZFS 文件系统问题
  11. 我一直在维护的石墨文档开源了
  12. 计算机启动后出现黑屏鼠标,电脑开机黑屏只有鼠标,小编教你电脑开机黑屏鼠标能动怎么办...
  13. 如何下载blob:https://www.bilibili.com/的视频
  14. ambari 修改服务器名,ambari - Ambari无法运行用于修改用户配置单元的自定义钩子 - 堆栈内存溢出...
  15. 使用AFNetworking(一)
  16. MYSQL的简单查询
  17. (二)买基金的成本知识
  18. 基于FPGA的SSI接口协议实现
  19. 计算机软考需要多少分
  20. 从零开始的Linux学习日志(3)

热门文章

  1. 6-8 在数组中查找指定元素 (15 分)
  2. python列表操作-赋值
  3. KDZD-30kVA50kV试验变压器操作台
  4. 阿里3.10笔试第一题
  5. python中如何忽略警告?(代码)
  6. 考研英语复试-常用的口语表达句型
  7. 策略模式 - Unity
  8. html5 css3基础知识详解
  9. Oracle中having函数和in函数的用法
  10. #PCIE# pcie 的接口信号讲解