思路:

(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. [ZJOI 2006]超级麻将

    Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的牌有ai ...

  2. [BeiJing2011]元素

    Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力 ...

  3. ●CodeForces 549F Yura and Developers

    题链: http://codeforces.com/problemset/problem/549/F题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部分 ...

  4. ●BZOJ 4821 [Sdoi2017]相关分析

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...

  5. 如何让Mac、Windows可以互相远程

    您可以通过Mac来远程Windows桌面:也可通过Windows来远程Mac界面:甚至还可以通过iOS或Android来远程Mac或Windows. Windows的操作方法,以Windows XP ...

  6. C语言程序设计第一次作业1

    (一)实验总结 1. 圆面积问题 1:求圆面积和周长 (1)输入圆的半径,计算圆的周长和面积. (2) (3) 2:判断闰年 (1)输入一个四位年份,判断其是否是闰年.闰年的判别条件是该年年份能被4整 ...

  7. Oracle VM VirtualBox虚拟机内Linux系统硬盘扩容步骤(CentOS6.5)

    1.首先获取要扩容的虚拟机的 UUID VBoxManage 改命令在C:\Program Files\Oracle\VirtualBox目录内,可先添加该目录到环境变量.C:\Users\yzkj- ...

  8. 反向Ajax之Socket.io

    1.什么是反向ajax? 传统的ajax的困惑? 新需求--当服务器端数据发生变化时,客户端(浏览器端)如何即时得到通知呢? 找一些实际的案例:客服系统.在线聊天 这类应用,有一个显著的特点: 数据并 ...

  9. Jenkins持续集成环境, 如何自定义 maven 仓库

    最后的解决方法: job-->configure-->Build-->Goals and options: clean package -Dmaven.repo.local=D:\d ...

  10. java中的构造,封装

    今天给大家讲一下面向对象中的构造,封装: 构造:构造方法有以下几个特点:1.方法名和类名一致.2.无返回类型.接下来的几种构造样式,直接上代码吧: //这是一个宠物类 有一个属性:名字(name) p ...