hiho_1049 二叉树遍历
题目大意
给出一棵二叉树的前序和中序遍历结果,求出后序遍历的结果。保证二叉树中节点值均不相同。
分析
通过前序和中序遍历的结果,我们可以构建出二叉树,若构建出二叉树,则后序遍历的结果很容易求出(当然递归方法很容易)。主要是二叉树的构建。
二叉树类型非常适合用递归进行求解,所以考虑通过递归的方式来建立二叉树。由前序和中序遍历性质可知,前序遍历的第一个值就是二叉树中根节点的值,因此可以将之作为根节点,然后从中序遍历结果中找到对应的值(保证树中所有节点值均不相同)所在的位置A,则A左边的就是A的左子树中的节点(根据中序遍历的性质可知)。每次从前序数组中找到一个新的节点,可以将中序数组分割出左半部分.....
递归求解,主要是状态参数的选取。前序遍历结果数组pre_order,中序遍历结果数组middle_order, 选择中序遍历的左边界 middle_left_index(表示当前递归构建出来的子树节点们在中序遍历数组中的左边界), 中序遍历的右边界 middle_right_index(表示当前递归构建出来的子树节点们在中序遍历数组中的左边界),pre_index 表示当前前序遍历数组的索引(用于选择根节点,且将中序遍历数组分割出左部分)。
实现
#pragma once
#pragma execution_character_set("utf-8")
// 本文件为utf-8 编码格式
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char c = '0') :val(c), left(NULL), right(NULL){};
}; TreeNode* BuildTree(char* pre_order, char* middle_order, int& pre_index, int middle_left_index, int middle_right_index){
if (middle_left_index >= middle_right_index)
return NULL;
if (pre_order[pre_index] == '\0')
return NULL;
char root_val = pre_order[pre_index++];
int middle_root_index = middle_left_index;
while (middle_order[middle_root_index] != '\0' && middle_order[middle_root_index] != root_val)
middle_root_index++;
if (middle_order[middle_root_index] == '\0')
return NULL;
TreeNode* root = new TreeNode(root_val);
root->left = BuildTree(pre_order, middle_order, pre_index, middle_left_index, middle_root_index);
root->right = BuildTree(pre_order, middle_order, pre_index, middle_root_index + 1, middle_right_index);
return root;
} void PostOrderTravel(TreeNode* root){
if (!root)
return;
PostOrderTravel(root->left);
PostOrderTravel(root->right);
printf("%c", root->val);
}
int main(){
char pre_order[27];
char middle_order[27];
scanf("%s", pre_order);
scanf("%s", middle_order);
int pre_index = 0;
TreeNode* root = BuildTree(pre_order, middle_order, pre_index, 0, strlen(middle_order));
PostOrderTravel(root);
return 0;
}
hiho_1049 二叉树遍历的更多相关文章
- C++ 二叉树遍历实现
原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...
- python实现二叉树遍历算法
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...
- 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历
[二叉树遍历模版]前序遍历 1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...
- hdu 4605 线段树与二叉树遍历
思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...
- poj2255 (二叉树遍历)
poj2255 二叉树遍历 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descripti ...
- D - 二叉树遍历(推荐)
二叉树遍历问题 Description Tree Recovery Little Valentine liked playing with binary trees very much. Her ...
- 二叉树遍历 C#
二叉树遍历 C# 什么是二叉树 二叉树是每个节点最多有两个子树的树结构 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 二叉树遍历(flist)(二叉树,已知中序层序,求先序)
问题 C: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 76 解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...
随机推荐
- 深入理解include预编译原理
http://ticktick.blog.51cto.com/823160/596179 你了解 #include 某个 .h 文件后,编译器做了哪些操作么? 你清楚为什么在 .h文件中定义函数实现的 ...
- 谷歌Chrome浏览器如何设置网页的默认编码方法
设置->高级->自定义字体->编码->utf-8
- common-pool2 使用
common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象池为例介绍其使用方式,一般实现自己的对象池需要经过2个步骤 1.实现PooledO ...
- 华为S9306简单实用配置合集
华为QuidWay交换机配置命令手册: .开始 建立本地配置环境,将主机的串口通过配置电缆与以太网交换机的Console口连接. 在主机上运行终端仿真程序(如Windows的超级终端等),设置终端通信 ...
- shell 中的>文件重定向符 和 标准输入、输出、错误以及 2&1 的含义*
http://www.cnblogs.com/chenmh/p/5382044.html 问:其中 的2>&1是怎么回事? . test.sh > test.log 2>&a ...
- JAVA的名词释义
JDK : Java Development Toolkit (java 开发工具包). JDK是整个JAVA的核心,包括了java运行环境(Java Runtime Envirnmet),一堆jav ...
- 3d中的坐标系的概念
世界坐标系 世界坐标系是一个特殊的坐标系,它建立了描述其它坐标系所需要的参考框架.从另一方面说能够用世界坐标描述其它坐标系的位置,而不能用更大的.外部的坐标系来描述世界坐标系. 物体坐标系 物体坐标系 ...
- RabbitMQ在CentOS上的简单安装配置
安装 1.依赖Erlang,yum install erlang安装之 2.去官网下载Fedora/RHEL的rpm包,rpm -ivh rabbitmq-server-*.noarch.rpm 安装 ...
- word 与 endnote 反应慢的小技巧
使用Word 2007/2010打开含有EndNote标注的文档时,Word反应速度会变慢,甚至出现“假死”状态,要等很长时间才能正常工作.问题出在Word的校正功能上,Word会对EndNote的标 ...
- SQL 2008下载地址以及全新安装详细过程
本博文将详细介绍如何安装SQL 2008以及在这个安装过程中每个选项的意思,如何选择使用什么和不使用什么等等琐碎的东东. 下面——开始了!!!SHOW TIME~~~先提供各种程序下载地址:SQL 2 ...