思路:

(1)需要了解前序遍历和和中序遍历的特点,前序遍历第一个元素即为根节点,然后再在中序遍历以这个根节点为界限得到宏观上的左子串和右子串,如下图

(2)又可以将截取的子串分为新的子串问题,从而可以通过迭代来解决,

(3)构建左子树:主要就是指针的运用,获取前序遍历左子串的起始地址和子串长度,中序遍历左子串起始位置和根节点位置

root->left = ConstructCore(preStart+1,leftPreOrderEnd,  inStart,rootInorder-1);

(4)同理可得右子树

root->right = ConstructCore(leftPreOrderEnd+1,preEnd,rootInorder+1,inEnd);

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*剑指offer第6个问题
  4. 根据前序和中序遍历来重建二叉树
  5. */
  6. //定义二叉树结构
  7. typedef struct BiTreeNode
  8. {
  9. char data;
  10. struct BiTreeNode *left;
  11. struct BiTreeNode *right;
  12. }BiTreeNode;
  13. //重建核心函数,前序的子串起始位置和中序子串的起始位置
  14. BiTreeNode* ConstructCore(int *preStart,int *preEnd,int *inStart,int *inEnd);
  15. //重建函数 输入前序遍历和中序遍历的首位置,长度
  16. BiTreeNode* Construct(int *preOrder,int *inOrder,int length)
  17. {
  18. //安全性检查
  19. )
  20. {
  21. printf("Error input!\n");
  22. ;
  23. }
  24. //开始进行核心组件的迭代,
  25. ,
  26. inOrder,inOrder+length-);
  27. }
  28.  
  29. BiTreeNode* ConstructCore(int *preStart,int *preEnd,
  30. int *inStart,int *inEnd)
  31. {
  32. //前序遍历的第一个元素为根节点
  33. ];
  34.  
  35. // printf("%d ",rootValue);
  36. //构建起始节点
  37. BiTreeNode* root = (BiTreeNode*)malloc(sizeof(BiTreeNode));
  38. root->data = rootValue;
  39. root->left = root->right = NULL;
  40.  
  41. //次数遍历到最后一个元素
  42. if(preStart==preEnd)
  43. {
  44. if(inStart==inEnd && *preStart==*inStart)
  45. return root;
  46. ;}
  47. }
  48. /*迭代前序遍历找根节点,中序遍历*/
  49. //在中序遍历中找到根节点
  50. int *rootInorder = inStart;
  51. while(*rootInorder!=rootValue&&rootInorder<inEnd)
  52. {rootInorder++;}
  53.  
  54. // if(rootInorder==inEnd && *rootInorder!==rootValue)
  55. // {
  56. // printf("输入错误!\n");
  57. // return 0;
  58. // }
  59. //左子串的地址偏移长度
  60. int leftLength = rootInorder-inStart;
  61. //左子串的前序遍历截止地址
  62. int *leftPreOrderEnd = preStart+leftLength;
  63. //开始递归构建
  64. )
  65. {
  66. //构建左子树 输入为前序遍历子串的起始地址,中序遍历子串的起始地址
  67. root->left = ConstructCore(preStart+,leftPreOrderEnd,
  68. inStart,rootInorder-);
  69. }
  70. if(leftLength<preEnd-preStart)
  71. {
  72. //构建右子树,输入为前序遍历子串的起始地址,中序遍历子串的起始地址
  73. root->right = ConstructCore(leftPreOrderEnd+,preEnd,
  74. rootInorder+,inEnd);
  75. }
  76. return root;
  77. }
  78.  
  79. //打印后续遍历二叉树的结果
  80.  
  81. void lastOrderTraverse(BiTreeNode *root){
  82. if(root){
  83. lastOrderTraverse(root->left);
  84. lastOrderTraverse(root->right);
  85. printf("%d ",root->data);
  86. }
  87. }
  88.  
  89. int main(int argc,char *argv[])
  90. {
  91.  
  92. ,,,,,,,};
  93. ,,,,,,,};
  94. int length = sizeof(preorder)/sizeof(int);
  95. BiTreeNode *t = Construct(preorder,inorder,length);
  96. printf("后序遍历结果为:\n")
  97. lastOrderTraverse(t);
  98.  
  99. ;
  100. }

剑指offer面试题6 重建二叉树(c)的更多相关文章

  1. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...

  2. 剑指Offer:面试题6——重建二叉树(java实现)

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

  3. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

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

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

  5. 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)

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

  6. 剑指offer第二版-7.重建二叉树

    描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树.假设前序遍历或中序遍历的结果中无重复的数字. 思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍 ...

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

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

  8. 剑指offer(4)重建二叉树

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

  9. 剑指offer——面试题8:二叉树的下一个节点

    // 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...

随机推荐

  1. [NOI2011]道路修建

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...

  2. [JLOI2015]管道连接

    题目描述 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰.该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m 对情报站 ui;vi 和费用 wi,表示情报站 ui 和 v ...

  3. POJ2135:Farm Tour

    题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路 题解:可以定义一个源点s,和一个汇点t s和1相连容量为2,费用为0, t和n相连容量为2,费用为0 然后所用的边的容量都定为 ...

  4. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  5. 【NOIP2013】传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  6. 试说明采用双缓冲技术如何进行I/O操作

    输入设备先将第一个缓冲区装满数据,在输入设备向第二个缓冲区装数据时,处理机就可以从第一个缓冲区取出数据进行处理:当一个缓冲区的数据处理完毕,若第二个缓冲区已经装满,则处理机又可以从第二个缓冲区取出数据 ...

  7. Python与C的简单比较(Python3.0)

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

  8. 点(x1, y1)关于点(x0, y0)逆时针旋转a度后的坐标求解

    问题描述: 求点(x1, y1)关于点(x0, y0)逆时针旋转a度后的坐标 思路: 1.首先可以将问题简化,先算点(x1, y1)关于源点逆时针旋转a度后的坐标,求出之后加上x0,y0即可. 2.关 ...

  9. Python笔记(一)——打印输出

    一.输出语句input    输出语句print 例:用户输入 username = input("username:") #变量名 显示的字符 password = input( ...

  10. C语言 分支与循环 递推思想 穷举 流程的转移控制

    条件语句 开关控制语句(SWITCH语句) 象坐电梯一样,break是按的楼层,不加break则会一直执行下去. 上面程序有细节BUG,边界测试输入-5,105时由于整除会得到错误的结果. 解决方法: ...