思路:

(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. [BZOJ1977]严格次小生成树

    [问题描述] 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等. 正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成 ...

  2. ●洛谷P1291 [SHOI2002]百事世界杯之旅

    题链: https://www.luogu.org/recordnew/show/5861351题解: dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完. 初始值:dp ...

  3. bzoj 4010: [HNOI2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  4. bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp

    2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1159  Solved: 593[Submit] ...

  5. win7+Apache 设置域名指向本地文件夹

    实现:浏览器地址栏输入 www.bnzoo.com 访问 D:/www 系统:win7旗舰版+Apache 步骤: 1.打开文件 C:\Windows\System32\drivers\etc\hos ...

  6. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  7. Linux学习之CentOS(十二)----磁盘管理之 认识ext文件系统(转)

    认识ext文件系统 硬盘组成与分割 文件系统特性 Linux 的 EXT2 文件系统(inode) 与目录树的关系 EXT2/EXT3 文件的存取与日志式文件系统的功能 Linux 文件系统的运行 挂 ...

  8. Modern Algebra 读书笔记

    Modern Algebra 读书笔记 Introduction 本文是Introduction to Modern Algebra(David Joyce, Clark University)的读书 ...

  9. js页面刷新跳转的几种方式及区别

    跳转常用方法: window.location.href="index.php"; window.history.back(-1);//类似于按钮,参数是负几,就后退几次. win ...

  10. 找到一个牛的一逼的,超简易ssm和ssh的学习网址

    http://how2j.cn 蛋疼的是,我早就用springboot了!不过,可以给公司新人看.