思路:

(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. [SDOI2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

  2. ●POJ 1195 Mobile phones

    题链: http://poj.org/problem?id=1195 题解: 二维树状数组 #include<cstdio> #include<cstring> #includ ...

  3. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  4. APIO 2015

    老师让我们打这套题练练手.感觉这套题还是挺有意思的,比国内某些比赛不知道高到哪里去.最后我拿了284/300,貌似比赛是IOI赛制啊,强行被当成OI赛制做了,不然我T3可能还能多骗点. T1.scul ...

  5. bzoj 2229: [Zjoi2011]最小割

    Description 小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同 ...

  6. Codeforces Round #430 D. Vitya and Strange Lesson

    Today at the lesson Vitya learned a very interesting function - mex. Mex of a sequence of numbers is ...

  7. ubuntu16.04安装eclipse后启动栏图标为问号

    ubuntu创建eclipse快捷方式图标. cd /usr/share/applications sudo touch eclipse.desktop sudo gedit eclipse.desk ...

  8. 缓冲区(buffer)与缓存(cache)

    下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区, ...

  9. Failed to connect to GitHub to update the CocoaPods/Specs specs repo - Please check if you are offline, or that GitHub is down

    Failed to connect to GitHub to update the CocoaPods/Specs specs repo - Please check if you are offli ...

  10. Cisco 的基本配置实例之四----vlan的规划及配置(核心交换机)

    4.vlan的规划及配置 在本节中我们讲解vlan的规划及具体的配置命令.在此例中我们用的是vtp(VLAN Trunking Protocol)server的模式,在这种模式中我们需要配置核心交换机 ...