wikioi 1013 求先序排列 普及组 2001
来源:互联网 发布:软件售后工程师工资 编辑:程序博客网 时间:2024/06/08 04:33
http://wikioi.com/problem/1013/
以下借鉴了一篇当时看得题解
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
前序遍历的规律是:输出根结点,输出左子树,输出右子树;
中序遍历的规律是:输出左子树,输出根结点,输出右子树;
后序遍历的规律是:输出左子树,输出右子树,输出根结点;
根据中序和后序序列的规律,我们可以知道构造二叉树的过程是一个递归的过程,根据给定的 中序和后序序列,建立二叉树的根结点,并将中序序列划分为左子树序列和右子树序列,然后分别把左子树序列和右子树序列递归的构造左子树和右子树。
具体的算法是分别用数组mid[lm..rm]和post[tp..rp]存储给定的中序和后序序列。易知post[rp]为根结点,创建二叉树的根结点t,设t->data = post[rp];遍历mid,寻找根结点post[rp]的下标pos,则mid[lm..pos-1]为左子树序列,mid[pos+1..rm]为右子树序列;左子树序列的长度lenL= pos - lm,右子树序列的长度lenR= rm - pos。
很明显,若pos == lm,则lenL = 0,说明根结点无左子树;若pos == rm,则lenR = 0,说明根结点无右子树;
根据后序序列的规律,可以知道根结点t的左子树的后序排列为post[lp..lp+lenL-1];
根结点t的右子树的后序排列为post[lp+lenL..rp-1]。
采用同样的方法递归构造根结点t的左右子树。
以样例输入为例:
中序序列:BADC
后序序列:BDCA
1.得到根结点t->data = 'A';
2.遍历中序序列mid,得到mid[pos] = 'A',lenL = 1;
3.得到根结点t的左子树的中序序列为mid[lm..pos-1] = "B",右子树的中序序列为mid[pos+1..rm] = "DC";根结点t的左子树的后序序列为post[lp..lp+lenL-1] = "B",右子树的后序序列为post[lp+lenL..rp-1] = "DC";
4.递归构造根结点t的左子树t->lc,设t= t->lc:
1.得到根结点t->data = 'B';
2.遍历中序序列mid,得到mid[pos] = 'B',lenL = 0;
3.得到根结点t的左右子树均为空,返回调用函数。
5. 递归构造根结点t的右子树t->rc,设t= t->rc:
1.得到根结点t->data = 'C';
2.遍历中序序列mid,得到mid[pos] = 'C',lenL = 1;
3.得到根结点t的左子树的中序序列为"D",后序序列为"D";右子树为空,
4.递归构造根结点t的左子树t->lc;
6.最后得到整棵二叉树,前序遍历二叉树,得到前序序列:ABCD。
#include<iostream>#include<cstring>using namespace std;char a[20],b[20];void out(char a[],char b[],int l){ int i=0; cout<<b[l-1];//输出当前根 while(a[i]!=b[l-1])i++;//划分 if(i>0)out(a,b,i); if(i<l-1)out(a+i+1,b+i,l-i-1);}int main(){ cin>>a>>b; out(a,b,strlen(a));//分治 return 0;}
- wikioi 1013 求先序排列 普及组 2001
- wikioi 1014 装箱问题 普及组 2001
- NOIP 2001 普及组 复赛 求先序排列
- wikioi 1011 数的计算 普及组 2001
- wikioi 1012 最大公约数和最小公倍数 普及组 2001
- wikioi 1007 级数求和 普及组 2002
- wikioi 1008 选数 普及组 2002
- wikioi 1009 产生数 普及组 2002
- wikioi 1010 过河卒 普及组 2002
- wikioi 1017 乘积最大 普及组 2000
- wikioi 1014 装箱问题 (2001年NOIP全国联赛普及组)
- wikioi 1015 计算器的改良 普及组 2000
- wikioi 1016 税收与补贴 普及组 2000
- [Wikioi 1009][NOIP 2002普及组]产生数
- [Wikioi 1025][NOIP 2003普及组]数字游戏
- wikioi 1294 全排列
- wikioi p1294 全排列
- wikioi全排列c++
- UIImagePickerController属性与使用
- textarea 禁止拉动兼容
- Keil C51对C语言的关键词扩展之十一: xdata
- C++基础知识回顾
- Hanoi(汉诺)塔问题
- wikioi 1013 求先序排列 普及组 2001
- Spring AOP(一)
- 推荐10款免费的在线UI测试工具
- c语言数字转字符串
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
- 1--n数里的1的个数
- Spring AOP(二)
- 网站小问题总结
- js_day15--js面向对象编程+this关键字+成员函数