思路:

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

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

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

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

(4)同理可得右子树

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

 #include <stdio.h>
 #include <stdlib.h>
 /*剑指offer第6个问题
 根据前序和中序遍历来重建二叉树
 */
 //定义二叉树结构
 typedef struct BiTreeNode
 {
     char data;
     struct BiTreeNode *left;
     struct BiTreeNode *right;
 }BiTreeNode;
 //重建核心函数,前序的子串起始位置和中序子串的起始位置
 BiTreeNode* ConstructCore(int *preStart,int *preEnd,int *inStart,int *inEnd);
 //重建函数 输入前序遍历和中序遍历的首位置,长度
 BiTreeNode* Construct(int *preOrder,int *inOrder,int length)
 {
     //安全性检查
     )
     {
         printf("Error input!\n");
         ;
     }
     //开始进行核心组件的迭代,
     ,
                          inOrder,inOrder+length-);
 }

 BiTreeNode* ConstructCore(int *preStart,int *preEnd,
                           int *inStart,int *inEnd)
 {
     //前序遍历的第一个元素为根节点
     ];

 //    printf("%d ",rootValue);
     //构建起始节点
     BiTreeNode* root = (BiTreeNode*)malloc(sizeof(BiTreeNode));
     root->data = rootValue;
     root->left = root->right = NULL;

     //次数遍历到最后一个元素
     if(preStart==preEnd)
     {
         if(inStart==inEnd && *preStart==*inStart)
             return root;
         ;}
     }
     /*迭代前序遍历找根节点,中序遍历*/
     //在中序遍历中找到根节点
     int *rootInorder = inStart;
     while(*rootInorder!=rootValue&&rootInorder<inEnd)
         {rootInorder++;}

 //    if(rootInorder==inEnd && *rootInorder!==rootValue)
 //    {
 //        printf("输入错误!\n");
 //        return 0;
 //    }
     //左子串的地址偏移长度
     int leftLength = rootInorder-inStart;
     //左子串的前序遍历截止地址
     int *leftPreOrderEnd = preStart+leftLength;
     //开始递归构建
     )
     {
         //构建左子树 输入为前序遍历子串的起始地址,中序遍历子串的起始地址
         root->left = ConstructCore(preStart+,leftPreOrderEnd,
                                    inStart,rootInorder-);
     }
     if(leftLength<preEnd-preStart)
     {
         //构建右子树,输入为前序遍历子串的起始地址,中序遍历子串的起始地址
         root->right = ConstructCore(leftPreOrderEnd+,preEnd,
                                     rootInorder+,inEnd);
     }
     return root;
 }

 //打印后续遍历二叉树的结果

 void lastOrderTraverse(BiTreeNode *root){
     if(root){
         lastOrderTraverse(root->left);
         lastOrderTraverse(root->right);
         printf("%d ",root->data);
     }
 }

 int main(int argc,char *argv[])
 {

     ,,,,,,,};
     ,,,,,,,};
     int length = sizeof(preorder)/sizeof(int);
     BiTreeNode *t = Construct(preorder,inorder,length);
     printf("后序遍历结果为:\n")
     lastOrderTraverse(t);

     ;
 }

剑指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. [HAOI2007]分割矩阵

    题目描述 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个),这样分割了(n-1)次后,原矩阵被分割成了n个矩阵.(每 ...

  2. ●BZOJ 1233 [Usaco2009Open] 干草堆 tower

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1233 留坑.以后再来看看. (绝望,无奈,丧心...) (这个题的证明真的很诡异啊,看得我稀 ...

  3. ●ZOJ 2112 Dynamic Rankings

    ●赘述题目 对于一个长为n(n<50000)的序列(序列中的数小于1000000000),现有如下两种指令: Q a b c:询问区间[a,b]中第c小的数. C p b:将序列中的从左往右数第 ...

  4. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. bzoj4517排列计数 错排+组合

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Statu ...

  7. 从零安装Scrapy心得 | Install Python Scrapy from scratch

    1. 介绍 Scrapy,是基于python的网络爬虫框架,它能从网络上爬下来信息,是data获取的一个好方式.于是想安装下看看. 进到它的官网,安装的介绍页面 https://docs.scrapy ...

  8. thymeltesys-基于Spring Boot Oauth2的扫码登录框架

    thymeltesys thymelte是一个基于Spring Boot Oauth2的扫码登录框架,使用PostgreSQL存储数据,之后会慢慢支持其他关系型数据库.即使你不使用整个框架,只使用其中 ...

  9. Win7删除文件夹提示找不到该项目无法删除

    在使用win7操作系统的过程中,有一些朋友会遇到这种情况,因为某种不明原因,硬盘里面某一个文件夹无法删除,表现为在删除的时候,系统提示找不到该项目,即找不到该文件夹,就像它变成了幽灵一样,看得到却摸不 ...

  10. K-means聚类 的 Python 实现

    K-means聚类 的 Python 实现 K-means聚类是一个聚类算法用来将 n 个点分成 k 个集群. 算法有3步: 1.初始化– K 个初始质心会被随机生成 2.分配 – K 集群通过关联到 ...