剑指offer面试题6 重建二叉树(c)
思路:
(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)的更多相关文章
- 剑指offer面试题6 重建二叉树(java)
注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...
- 剑指Offer:面试题6——重建二叉树(java实现)
问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不包含重复的数字. 例如: 输入:前序{1,2,4,7,3,5,6,8},中序{4,7,2,1 ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- 剑指Offer - 九度1385 - 重建二叉树
剑指Offer - 九度1385 - 重建二叉树2013-11-23 23:53 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的 ...
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)
题目:输入某二叉树的前序遍历和中序遍历的结果.请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如:输入前序遍历 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7 ...
- 剑指offer第二版-7.重建二叉树
描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树.假设前序遍历或中序遍历的结果中无重复的数字. 思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍 ...
- 剑指offer【04】- 重建二叉树(java)
题目:重建二叉树 考点:树 题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6, ...
- 剑指offer(4)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer——面试题8:二叉树的下一个节点
// 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...
随机推荐
- [JLOI 2011]飞行路线&[USACO 09FEB]Revamping Trails
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- [SCOI2008]配对
题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对.例如A={5,6,8},B={5, ...
- [BZOJ]1177: [Apio2009]Oil
题目大意:给出一个n*m的矩阵,选出3个不相交的k*k子矩阵,使得子矩阵中元素和最大.(k<=n,m<=1500) 思路:选出的子矩阵有3种情况:横着排三个.竖着排三个.三角状分布(其中有 ...
- 【USACO17JAN】Promotion Counting晋升者计数 线段树+离散化
题目描述 The cows have once again tried to form a startup company, failing to remember from past experie ...
- ●POJ 1329 Circle Through Three Points
题链: http://poj.org/problem?id=1329 题解: 计算几何,求过不共线的三点的圆 就是用向量暴力算出来的东西... (设出外心M的坐标,由于$|\vec{MA}|=|\ve ...
- 【Codeforces Round #431 (Div. 1) D.Shake It!】
·最小割和组合数放在了一起,产生了这道题目. 英文题,述大意: 一张初始化为仅有一个起点0,一个终点1和一条边的图.输入n,m表示n次操作(1<=n,m<=50),每次操作是任选一 ...
- LCD接口和RGB介绍
1. 介绍 Video的显示离不开LCD, 所以这里简单介绍一下LCD的接口和RGB LCD的全称是Liquid Crystal Display 的简称, 即液晶显示器LCD目前已经取代CRT, 成为 ...
- springmvc上传文件方法及注意事项
本文基于注解的配置,敬请留意 基于注解整合 一.springmvc为我们提供两种上传方式配置: org.springframework.web.multipart.commons.CommonsMu ...
- quartz问题记录-missed their scheduled fire-time
这里有3个原因:1.所有的woker thread(工作线程; 辅助线程)都在运行其他的job2.scheduler(调度器)down了(关于这个down.我不太明确是shutdown了..还是挂掉了 ...
- ubuntu14.0464位 Ros环境 安装halcon13.01
至于ROS的系统,之前就是安装好的,如果有疑问的可以参考官网的安装教程,按照指令一步一步的操作,http://wiki.ros.org/cn/indigo/Installation/Ubuntu (1 ...