剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了。直接看题目描述吧(题目摘自九度oj剑指offer面试题6):
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
- 输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。
输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。
输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。
输出
对应每个测试案例,输出一行:
如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。
如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。
下面看一下解题思路:
二叉树的问题,我们首先想到递归思想,即大问题的解题思路和小问题的解决思路是一样的。先来分析二叉树的先序和中序遍历序列能给我们哪些有用的信息,首先先序遍历可以告诉我们二叉树的根节点(即先序遍历序列的第一个元素)。其次,我们可以通过查询得到二叉树的根节点在中序遍历序列中的位置(假设为L),那么中序遍历序列L之前的是左子树,之后的右子树。知道这两部分信息之后,我们在考虑后序遍历,对于一个二叉树来说,根节点是后序遍历的最后一个去遍历的节点。
经过以上分析,我们就可以这样解题了(如下图):
现在要考虑的是,先递归右子树还是左子树,因为后序遍历是先左后右,而我们现在是从后往前得到后序遍历序列,所以先递归右子树。还有一个问题,即什么时候不能构成二叉树,本人以为只要根节点在中序遍历序列中查找不到就不能构成二叉树。
题目就分析到这,下面给出C语言完整代码,在九度oj上已AC,代码如下:
#include<stdio.h>
#include<stdlib.h>
/*
*已知二叉树的先序和中序遍历,求后序遍历
*/
int pos[];
int n;
int flag=;
int locationInMid(int mid[],int ms,int me,int h)
{
int i;
for(i=ms;i<=me;++i)
{
if(mid[i]==h)
return i;
}
return -;
}
void postOrder(int pre[],int ps,int pe,int mid[],int ms,int me) //有待改进的地方,函数的参数可以简化,因为数组的地址是0号元素的地址,知道头结点在mid中的位置后,左右子树的个数即可得到
{
int hm=,cl=,cr=;
pos[--n]=pre[ps];
//--n;
hm=locationInMid(mid,ms,me,pre[ps]);
if(hm==-)
{
// printf("No\n");
flag=-;
return ;
}
else
{
cl=hm-ms;
cr=me-hm;
if(cr>)
postOrder(pre,ps+cl+,pe,mid,hm+,me);
if(cl>)
postOrder(pre,ps+,ps+cl,mid,ms,hm-);
}
return ;
}
int main()
{
int pre[];
int mid[];
int i,t;
while(scanf("%d",&n)!=EOF)
{
t=n;
for(i=;i<n;++i)
scanf("%d",&pre[i]);
for(i=;i<n;++i)
scanf("%d",&mid[i]);
postOrder(pre,,n-,mid,,n-);
if(flag==-)
{
printf("No\n");
flag=;
}
else
{
for(i=;i<t;++i)//注意:n是全局变量所以上一个语句执行完之后,n的值已经不是原来的n了,所以要用t保存n最初的值
printf("%d ",pos[i]);
printf("\n");
}
}
return ;
}
本题的代码并不是最简洁的,但最容易理解,其实ps,pe,ms,me四个变量并不完全需要,因为pre指向的pre[ps],而知道二叉树的节点个数和根节点在中序遍历中的位置即可求得左右子树的位置,大家可以思考一下,优化一下代码。
剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历的更多相关文章
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- 剑指offer面试题6 重建二叉树(c)
- 剑指offer面试题6 重建二叉树(java)
注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...
- 剑指Offer面试题:33.二叉树的深度
一.题目一:二叉树的深度 1.1 题目说明 题目一:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如下图中的二叉树的 ...
- 剑指Offer:面试题6——重建二叉树(java实现)
问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不包含重复的数字. 例如: 输入:前序{1,2,4,7,3,5,6,8},中序{4,7,2,1 ...
- 剑指Offer面试题:18.二叉树的镜像
一.题目:二叉树的镜像 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像.例如下图所示,左图是原二叉树,而右图则是该二叉树的镜像. 该二叉树节点的定义如下,采用C#语言描述: public c ...
- 剑指Offer面试题:23.二叉树中和为某一值的路径
一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...
- 剑指offer——面试题8:二叉树的下一个节点
// 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
题目: 输入一个链表.输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...
- 剑指offer面试题25:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从根节点开始往下一直到叶节点所经过的节点形成一条路径. 解题思路:当使用前序遍历的方式访问某一节点时,把该节点添加到路径上 ...
随机推荐
- source insight 配置小记
0/ Alt + T 打开 Document Options,设置字体,添加 C++ 类型文件 .cc , 删除 Plain txt 类型以避免添加 .txt 文件 1/ Alt + F12 切换函数 ...
- Drawing Images and Text
using System;using UIKit;using Foundation;using CoreGraphics;namespace GraphicsAnimation{ public cla ...
- Maximum Memory and CPU Limitations for Linux Server
grep NR_CPUS /boot/config-`uname -r` [webdev@test apache-flume-1.8.0-bin]$ grep NR_CPUS /boot/config ...
- 5.JavaScript改变样式,验证用户输入
① x=document.getElementById("demo") //找到元素 x.style.color="#ff0000"; //改变样式 ② if ...
- Could not get unknown property 'packageForR' for task ':app:processDebugReso
butterknife 注解框架的问题 删除项目中的有关butterknife 的 apply plgin.classpath 字段 把注解框架改为最新版本 implementation 'com.j ...
- Struts多个文件上传
Struts2多个文件上传 10级学员 韩晓爽课堂笔记 多个文件上传分为List集合和数组,下面我们着重介绍一下list集合的上传.都大同小异. 一 介绍 1. 在struts2文件上传的时候要先导入 ...
- 使用官方Android-support-v7在低版本上使用ActionBarActivity
昨天晚上更新了下Android SDK Manager,发现Extras下的Android Support Library已经更新到19.1了,上网一查原来是sdk\extras\android\su ...
- 2018年东北农业大学春季校赛 B wyh的矩阵【规律】
题目链接 https://www.nowcoder.com/acm/contest/93/B 思路 先加入 中间的那行 和中间的那列 再减去 最中间那个数 因为它 加了两次 然后逐行往下加 会发现是一 ...
- React + fetch API + 百度地图api + 跨域 填坑
做项目遇到一个百度地图api 的跨域问题.由于使用fetch ,在调用类似 http://api.map.baidu.com/geocoder/v2/callback=renderReverse&am ...
- POJ 1611 The Suspects (并查集+数组记录子孙个数 )
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 24134 Accepted: 11787 De ...