根据先序和中序序列重建二叉树
#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
根据先序和中序序列重建二叉树相关推荐
- 通过层序和中序遍历序列重建二叉树
在学二叉树的重建时,在<算法笔记>上学到了如何通过先序(或后序)遍历序列和中序遍历序列重建二叉树,它也提出了一个问题:如何通过层序和中序遍历序列重建二叉树?我一开始按照先序和中序重建的思路 ...
- 根据先序序列和中序,后序和中序序列创建二叉树
思考:如何才能确定一棵树? 结论: 通过中序遍历和先序遍历可以确定一个树 通过中序遍历和后续遍历可以确定一个树 通过先序遍历和后序遍历确定不了一个树. 算法实现: ...
- 给定二叉树先序、中序遍历序列,求后序遍历
给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...
- 数据结构---后序和中序遍历的二叉树序列还原二叉树
数据结构-后序和中序遍历的二叉树序列还原二叉树 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...
- 一遍搞定!关于如何已知后序和中序序列得到前序序列的问题
首先来个具体的问题吧,因为只是空谈显示不出效果. 如题 : 求先序排列 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点 ...
- 已知先序和中序序列求二叉树
已知二叉树的先序和中序序列,构造出相应的二叉树 先序:ABCDEFGHlJ 中序:CDBFEAIHGJ 1.由先序求出A为二叉树的根 2.在中序遍历中找到A的位置,则CDBFE为它的左子树,IHGJ为 ...
- C语言学习笔记——根据二叉树的后序和中序遍历序列,求这棵树的先序和层次遍历序列
先根据二叉树的后序和中序遍历序列,用递归的方法创建出这棵树,然后用的自定义栈的先序和层次方法遍历. 输入: 7 2 3 1 5 7 6 4 1 2 3 4 ...
- 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现
二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...
- Uva536 Tree Recovery二叉树重建(先序和中序确定二叉树,后序输出)
题目大意:给定二叉树先序和中序遍历,输出二叉树后序遍历. 方法:将英文字母映射为数字,利用数组存储,先序第一个节点是父节点,然后再从中序遍历中找到位置.注意边界.代码也很简单一次ac. #includ ...
- 数据结构----二叉树已知先序和中序遍历序列求后序遍历
说明 通过先序和中序或者中序和后序我们可以还原出原始二叉树,但是通过先序和后序是无法还原出原始二叉树也即是说,只有通过先序和中序,或者中序和后序我们才可以唯一的确定一个二叉树. 例子一 已知先序和中序 ...
最新文章
- mysql 日期和时间戳互换
- Java面试题之一 (转)
- recycleView 滑动删除Item,拖拽切换Item,你想了解的都在这儿
- UVa1450 Airport(二分法)
- Dataset之Pascal:Pascal竞赛及其Pascal VOC(VOC 2012、VOC 2007) 数据集的简介、下载、使用方法详细攻略
- 数据结构与索引-- mysql InnoDB存储引擎索引
- Spring Boot 消息队列 RocketMQ 入门
- 敏捷研发项目,我们该如何度量?
- day9 java的实例语句块和代码执行顺序
- Just a Hook(线段树区间更新)
- 如何用gitbook写文档并存到github上
- lxterminal命令打开新窗口并执行python脚本
- windows命令行设置和系统快捷键
- 遗传算法原理与应用详解
- 【标准】ISO14001:2015新版标准正式发布
- 关于elasticsearch属性not_analyzed,坑
- php写抢红包,红包生成函数(微信抢红包)
- NR 5G 系统信息
- 移动硬盘位置不可用参数错误的解决方法
- 经典的机器学习200道面试题及答案
热门文章
- Citrix Profile Management 和 VDI系列讲座之二:Profile漫游需要怎么配置存储和网络
- c++账户类 题目描述
- if you want to go to ruiyuan fund
- c# typeof 与 Type.GetType 使用与效率对比
- 常用linux下网络相关命令
- 18、Page Object 设计模式
- omct问题之-webapps下多出的ROOT目录
- C#Array(数组) 一维、多维数组
- XSS中JavaScript加密以及Filter bypass
- js自动判断浏览器类型跳转到手机版