根据一棵二叉树的先序遍历和后序遍历,重建二叉树

例子:

我们先来看一个例子,二叉树如上图,则先序遍历为:1 2 4 7 3 5 6 8,中序遍历为:4 7 2 1 5 3 8 6

思路:

先序遍历中的第一个元素为根节点,这个元素将中序遍历划分为左右两个部分,左边的为左子树的中序遍历,右边的为右子树的中序遍历,同样也可以将先序遍历除了第一个元素以外的划分为两个部分,第一个部分是左子树的先序遍历,第二部分是右子树的先序遍历。

由此可知,这是一个递归过程,可以利用递归函数来构建二叉树。对于二叉树的这种常见操作要熟悉,实现的代码要会写。

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // the binary tree node
  5. typedef struct BTNode{
  6. int key;
  7. struct BTNode *lchild;
  8. struct BTNode *rchild;
  9. }BTNode;
  10.  
  11. // find the key in the InOrder array, if not finded then return -1
  12. int findKey(int arr[], int start, int end, int key) {
  13. int i;
  14. for (i = start; i <= end; i++)
  15. if (arr[i] == key)
  16. return i;
  17. return -;
  18. }
  19.  
  20. // create the binary tree by PreOrder and InOrder
  21. BTNode *rebuildTree(int pre[], int startPre, int endPre, int in[], int startIn, int endIn) {
  22. // both order have the same size
  23. if (endPre - startPre != endIn - startIn)
  24. return NULL;
  25. // the root is the first node of PreOrder
  26. BTNode *root = (BTNode *) malloc(sizeof(BTNode));
  27. root->key = pre[startPre];
  28. root->lchild = NULL;
  29. root->rchild = NULL;
  30.  
  31. // find the index of root node in the InOrder
  32. int mid = findKey(in, startIn, endIn, pre[startPre]);
  33. if (mid == -)
  34. return NULL;
  35.  
  36. // if the left-subtree exists, create left-subtree
  37. int length;
  38. if (mid > startIn) {
  39. length = mid - startIn;
  40. root->lchild = rebuildTree(pre, startPre + , startPre + + length - , in, startIn, startIn + length - );
  41. }
  42.  
  43. // if the right-subtree exists, create right-subtree
  44. if (mid < endIn) {
  45. length = endIn - mid;
  46. root->rchild = rebuildTree(pre, endPre - length + , endPre, in, endIn - length + , endIn);
  47. }
  48.  
  49. return root;
  50. }
  51.  
  52. void postTraverse(BTNode *tree) {
  53. if (tree) {
  54. postOrder(tree->lchild);
  55. postOrder(tree->rchild);
  56. printf("%d ", tree->key);
  57. }
  58. }
  59.  
  60. int main() {
  61. int preOrder[] = {, , , , , , , };
  62. int inOrder[] = {, , , , , , , };
  63. BTNode *root = rebuildTree(preOrder, , , inOrder, , );
  64. postTraverse(root);
  65. printf("\n");
  66.  
  67. return ;
  68. }

[Jobdu] 题目1385:重建二叉树的更多相关文章

  1. 剑指Offer - 九度1385 - 重建二叉树

    剑指Offer - 九度1385 - 重建二叉树2013-11-23 23:53 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的 ...

  2. 九度OJ 1385 重建二叉树

    题目地址:http://ac.jobdu.com/problem.php?pid=1385 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都 ...

  3. [Jobdu] 题目1521:二叉树的镜像

    不知道怎么回事下面的代码通过了4个测试用例,还有1个测试用例始终是Runtime Error,各位帮我看一下是哪里出了问题 镜像输出两种方法,一种是递归进行调整,另外一种就是直接在先序遍历的基础上进行 ...

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

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

  5. 剑指offer【04】- 重建二叉树(java)

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

  6. 【剑指Offer面试编程题】题目1385:重建二叉树--九度OJ

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

  7. 九度oj题目1385:重建二叉树

    题目1385:重建二叉树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4419 解决:1311 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和 ...

  8. 九度oj 题目1385:重建二叉树

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

  9. 重建二叉树_C++

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

随机推荐

  1. Copy an serializable object deeply

    http://www.java2s.com/Tutorial/Java/0100__Class-Definition/Copyanserializableobjectdeeply.htm http:/ ...

  2. 如何在程序中动态设置墙纸(使用IActiveDesktop接口)

    大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParameter ...

  3. delphi 7中使用idhttp抓取网页 解决假死现象

    在delphi 7中使用idhttp抓取网页,造成窗口无反应的假死状态.通过搜索获得两种方法. 1.写在线程中,但是调用比较麻烦 2.使用delphi 提供的idantifreeze(必须安装indy ...

  4. Xcode 真机测试破解方法(转加修改)xcode 4.3 通过

    Xcode 真机测试破解方法(转加修改)xcode 4.3 通过 生成本机证书 应用程序->实用工具->钥匙串访问 菜单:钥匙串访问->证书助理->创建证书, 然后按以下图片顺 ...

  5. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  6. 深入Blocks分析

    1.简介 从iOS4开始,苹果引入了这个C语言的扩充功能"Blocks",在一些特定的场景下也是一把利刃.我前面一篇博客中初步介绍了Blocks这个东西,主要是语法的介绍(< ...

  7. String类的实现,内部采用字符数组实现

    #include <iostream> using namespace std; class String{ public: String(const char *str = NULL); ...

  8. QT 声明全局变量

    声明 qdatabasemanager.h #include"qdatabasemanager.h" externQDatabaseManager*Database; 引用 mai ...

  9. stl之map 排序

    排序问题,STL中默认是采用小于号来排序的,因为设置int等类型做key,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数 ...

  10. Object-c的一些基本概念

    自学了一个多月的IOS,对Object-C也有了初步的认识,也有很多观点不知道是否正确,所以整理了一下,和小伙伴们分享分享 1.OC中使用的消息机制代替调用方法 区别:使用消息结构的语言,其运行时缩引 ...