#include "stdafx.h"
#include <iostream>
#include <exception>
#include <stack>
using namespace std;/*重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图所示的二叉树并输出它的头结点。二叉树结点的定义如下:
*/struct BinaryTreeNode
{int  m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_PRight;
};BinaryTreeNode* ConstructConre(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{int rootValue = startPreorder[0];BinaryTreeNode* root = new BinaryTreeNode();root->m_nValue = rootValue;root->m_pLeft = root->m_PRight = NULL;if(startPreorder == endPreorder){if(startInorder == endInorder && *startPreorder ==*startInorder)return root;elsethrow std::exception("invalid input");}//在中序遍历中找到根结点的值int* rootInorder = startInorder;while(rootInorder <= endInorder&& *rootInorder !=rootValue)++ rootInorder;if(rootInorder ==endInorder && *rootInorder != rootValue)throw std::exception("Invalid input.");int leftLength = rootInorder - startInorder;int *leftPreorderEnd = startPreorder +leftLength;if(leftLength >0){//构建左子树root->m_pLeft = ConstructConre(startPreorder+1,leftPreorderEnd,startInorder,rootInorder -1);}if(leftLength<endPreorder - startPreorder){//构建右子树root->m_PRight = ConstructConre(leftPreorderEnd +1,endPreorder,rootInorder+1,endInorder);}return root;
}BinaryTreeNode* Construct(int *preOrder,int* inOrder,int length)
{if(preOrder==NULL||inOrder==NULL||length<=0){return NULL;}return ConstructConre(preOrder,preOrder+length-1,inOrder,inOrder+length-1);
}
int _tmain(int argc, _TCHAR* argv[])
{ return 0 ;
}

转载于:https://www.cnblogs.com/crazycodehzp/p/3556863.html

根据先序和中序序列重建二叉树相关推荐

  1. 通过层序和中序遍历序列重建二叉树

    在学二叉树的重建时,在<算法笔记>上学到了如何通过先序(或后序)遍历序列和中序遍历序列重建二叉树,它也提出了一个问题:如何通过层序和中序遍历序列重建二叉树?我一开始按照先序和中序重建的思路 ...

  2. 根据先序序列和中序,后序和中序序列创建二叉树

    思考:如何才能确定一棵树? 结论:    通过中序遍历和先序遍历可以确定一个树                 通过中序遍历和后续遍历可以确定一个树 通过先序遍历和后序遍历确定不了一个树. 算法实现: ...

  3. 给定二叉树先序、中序遍历序列,求后序遍历

    给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...

  4. 数据结构---后序和中序遍历的二叉树序列还原二叉树

    数据结构-后序和中序遍历的二叉树序列还原二叉树 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

  5. 一遍搞定!关于如何已知后序和中序序列得到前序序列的问题

    首先来个具体的问题吧,因为只是空谈显示不出效果. 如题 : 求先序排列 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点 ...

  6. 已知先序和中序序列求二叉树

    已知二叉树的先序和中序序列,构造出相应的二叉树 先序:ABCDEFGHlJ 中序:CDBFEAIHGJ 1.由先序求出A为二叉树的根 2.在中序遍历中找到A的位置,则CDBFE为它的左子树,IHGJ为 ...

  7. C语言学习笔记——根据二叉树的后序和中序遍历序列,求这棵树的先序和层次遍历序列

    先根据二叉树的后序和中序遍历序列,用递归的方法创建出这棵树,然后用的自定义栈的先序和层次方法遍历. 输入:  7 2 3 1 5 7 6 4                      1 2 3 4 ...

  8. 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现

    二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...

  9. Uva536 Tree Recovery二叉树重建(先序和中序确定二叉树,后序输出)

    题目大意:给定二叉树先序和中序遍历,输出二叉树后序遍历. 方法:将英文字母映射为数字,利用数组存储,先序第一个节点是父节点,然后再从中序遍历中找到位置.注意边界.代码也很简单一次ac. #includ ...

  10. 数据结构----二叉树已知先序和中序遍历序列求后序遍历

    说明 通过先序和中序或者中序和后序我们可以还原出原始二叉树,但是通过先序和后序是无法还原出原始二叉树也即是说,只有通过先序和中序,或者中序和后序我们才可以唯一的确定一个二叉树. 例子一 已知先序和中序 ...

最新文章

  1. mysql 日期和时间戳互换
  2. Java面试题之一 (转)
  3. recycleView 滑动删除Item,拖拽切换Item,你想了解的都在这儿
  4. UVa1450 Airport(二分法)
  5. Dataset之Pascal:Pascal竞赛及其Pascal VOC(VOC 2012、VOC 2007) 数据集的简介、下载、使用方法详细攻略
  6. 数据结构与索引-- mysql InnoDB存储引擎索引
  7. Spring Boot 消息队列 RocketMQ 入门
  8. 敏捷研发项目,我们该如何度量?
  9. day9 java的实例语句块和代码执行顺序
  10. Just a Hook(线段树区间更新)
  11. 如何用gitbook写文档并存到github上
  12. lxterminal命令打开新窗口并执行python脚本
  13. windows命令行设置和系统快捷键
  14. 遗传算法原理与应用详解
  15. 【标准】ISO14001:2015新版标准正式发布
  16. 关于elasticsearch属性not_analyzed,坑
  17. php写抢红包,红包生成函数(微信抢红包)
  18. NR 5G 系统信息
  19. 移动硬盘位置不可用参数错误的解决方法
  20. 经典的机器学习200道面试题及答案

热门文章

  1. Citrix Profile Management 和 VDI系列讲座之二:Profile漫游需要怎么配置存储和网络
  2. c++账户类 题目描述
  3. if you want to go to ruiyuan fund
  4. c# typeof 与 Type.GetType 使用与效率对比
  5. 常用linux下网络相关命令
  6. 18、Page Object 设计模式
  7. omct问题之-webapps下多出的ROOT目录
  8. C#Array(数组) 一维、多维数组
  9. XSS中JavaScript加密以及Filter bypass
  10. js自动判断浏览器类型跳转到手机版