bcfglm是按按姓氏笔画为序排列列的对吗?

3184人阅读
Name: 已知先后序和中序,求出它的先序排列
Copyright: 始发于goal的专栏;允许自由转载,但必须注明作者和出处
Author: goal
Date: 11-12-08 10:58
Description:
题目描述:
Description& &&&&&&
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。
输入格式 Input
Format &&&&&
& &&& 第一行为二叉树的中序序列
&&& 第二行为二叉树的后序序列
输出格式 Output
Format &&&
& &&& 一行,为二叉树的先序序列
样例输入 Sample
Input &&&&&
& &&& BADC BDCA
样例输出 Sample
Output &&&
& &&& ABCD
题目分析:
已知中序和前序排列,或者已知中序和后序序列,都能够构造一棵二叉树,此题考查后者。
前序遍历的规律是:输出根结点,输出左子树,输出右子树;&
中序遍历的规律是:输出左子树,输出根结点,输出右子树;
后序遍历的规律是:输出左子树,输出右子树,输出根结点;
根据中序和后序序列的规律,我们可以知道构造二叉树的过程是一个递归的过程,根据给定的
中序和后序序列,建立二叉树的根结点,并将中序序列划分为左子树序列和右子树序列,然后分别把左子树序列和右子树序列递归的构造左子树和右子树。
具体的算法是分别用数组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]
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。
算法思想:递归和分治。
数据结构:数组,二叉树。
时间复杂度:O(N);
空间复杂度:O(N);
程序语言:分别用c++和pascal实现。
若题目改为已知中序和前序序列,输出后序序列,因为先序序列pre[lp..rp]中根结点是第一个元素,所以只需将函数中的根结点数据由t-&data = post[rp] 改为t-&data = pre[lp]; 然后在递归构造左右子树时注意左子树中序序列为mid[lm+1..pos-1],右子树中序序列为mid[pos+1..rm],左子树先序序列为pre[lp+1..lp+lenL],右子树先序序列为pre[lp+lenL+1..rp],
最后后序遍历二叉树就行了。&
#include&iostream&
#include&string&
typedef struct BTNode{
struct BTNode *lc, *//左,右孩子指针
void PostBtree(BTree & t, string mid,
string post, int lm, int rm, int lp, int rp);
void Preorder(BTree p);
int main(int argc, char* argv[])
string mid,
PostBtree(root, mid, post, 0, mid.size()-1, 0, post.size()-1);
Preorder(root);
system("pause");
函数名称:PostBtree
函数功能:给出一棵二叉树的中序与后序序列,构造这棵二叉树。
输入参数: BTree
& t:二叉树的结点t
string mid:存储了二叉树的中序序列的字符串
string post:存储了二叉树的后序序列的字符串
int lm, int rm:二叉树的中序序列在数组mid中的左右边界
int lp, int rp:二叉树的后序序列在数组post中的左右边界
void PostBtree(BTree & t, string mid,
string post, int lm, int rm, int lp, int rp)
= new BTN //构造二叉树根结点
t-&data = post[rp];
t-&lc = t-&rc = NULL;
while (mid[pos] != post[rp])
int lenL = pos -
(pos & lm)//有左孩子,递归构造左子树
PostBtree(t-&lc, mid, post, lm, pos-1, lp, lp+lenL-1);
if (pos & rm)//有右孩子,递归构造右子树
PostBtree(t-&rc, mid, post, pos+1, rm, lp+lenL, rp-1);
//先序遍历
void Preorder(BTree p)
&&&&&& if(p
&&&&&&&&&&&&& cout
&& p-& //输出该结点
&&&&&&&&&&&&& Preorder(p-&lc);
//遍历左子树
&&&&&&&&&&&&& Preorder(p-&rc);
//遍历右子树
PASCAL代码:
PROGRAM EXAMP1132(INPUT, OUTPUT);
node = record
&&&&&&&&&&&&&& data :
&&&&&&&&&&&&&& lc, rc : BT
&&&&&&&&&&
mid, post :
{先序遍历}
PROCEDURE Preorder(t : BTree);
&&& &&&&&& if t && nil then
&&& &&&&&& begin
&&& &&&&&& &&&&write(t^.data);& {输出该结点}
&&& &&&&&& &&&&Preorder(t^.lc); {遍历左子树}
&&& &&&&&& &&&&Preorder(t^.rc); {遍历右子树}
{已知后序和中序,构造二叉树}
PROCEDURE PostBtree(var t : BT mid,
post : lm, rm, lp, rp : integer);
pos, lenL :
t^.data := post[rp];
t^.lc :=&&&
while mid[pos] && post[rp] do
&&&&&&&&&&&
lenL := pos -
if pos & lm then {有左孩子,递归构造左子树}
&&&&&&&&&&&
PostBtree(t^.lc, mid, post, lm, pos-1, lp, lp+lenL-1);
if pos & rm then {有右孩子,递归构造右子树}
&&&&&&&&&&&
PostBtree(t^.rc, mid, post, pos+1, rm, lp+lenL, rp-1);
{PostBtree}
&&&&&&&&&&
readln(mid);
readln(post);
PostBtree(root, mid, post, 1, ord(mid[0]), 1, ord(post[0]));
Preorder(root);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:89549次
积分:1450
积分:1450
排名:第14552名
原创:49篇
评论:34条
(3)(4)(2)(1)(1)(11)(26)(8)一道初二上册的数学难题.急.将正整数按如图4所示的规律排列下去.若用有序实数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的实数是( )A.22 B.23 C.24 D.25 1.第一排2_作业帮
拍照搜题,秒出答案
一道初二上册的数学难题.急.将正整数按如图4所示的规律排列下去.若用有序实数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的实数是( )A.22 B.23 C.24 D.25 1.第一排2
一道初二上册的数学难题.急.将正整数按如图4所示的规律排列下去.若用有序实数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的实数是( )A.22 B.23 C.24 D.25 1.第一排2 3.第二排4 6 7.第三排7 8 9 10.第四排图4麻烦大家看清楚点题目..不要擅自改题目哦 o(∩_∩)o 第3排是 4 6 7 不过也有可能是题目出错了哦....
将正整数按如图4所示的规律排列下去.若用有序实数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的实数是( ) A.22 B.23 C.24 D.251.第一排 2 3.第二排 4 5 6.第三排 7 8 9 10.第四排 第一排第一个数为1,第二排第一个数为2 (与第一排第一个数相差1)第三排第一个数为4 (与第二排第一个数相差2)第四排第一个数为7 (与第三排第一个数相差3)依此推导下去:第七排第一个数为22,第七排第二个数为23故:则(7,2)表示的实数是(23);答案:B可以如下推导更方便:第一排1个数,第二排2个数,第三排3个数,…,第六排6个数,一共(1+2+3+4+5+6)=21个数故::第七排第一个数为22,第七排第二个数为23故:则(7,2)表示的实数是(23);答案:B
第N排的第一个是:1+1+2+3+...+n-1=1+(n-1)n/2 那么第7排第一个是:1+[7-1]*7/2=22 即(7,2)表示:23
哇,真得很难将正整数按如图所示的规律排列下去,若有序实数对(n,m)表示第n排,从左到右第m个数,如(4,2)表示9,则表示58的有序数对是(  )A.(11,3)B.(3,11)C.(11,9)D.(9,11)【考点】.【专题】压轴题;规律型.【分析】根据排列规律可知从1开始,第N排排N个数,呈蛇形顺序接力,第1排1个数;第2排2个数;第3排3个数;第4排4个数根据此规律即可得出结论.【解答】解:根据图中所揭示的规律可知,1+2+3+4+5+6+7+8+9+10=55,所以58在第11排;偶数排从左到右由大到小,奇数排从左到右由小到大,所以58应该在11排的从左到右第3个数.故选A.【点评】主要考查了学生读图找规律的能力,能从数列中找到数据排列的规律是解题的关键.声明:本试题解析著作权属菁优网所有,未经书面同意,不得复制发布。答题:蓝月梦老师 难度:0.44真题:19组卷:147
解析质量好中差第一排1,第二排2,3,第三排4,5,6,第四排7,8,9,10,将正整数按这样的规律排列下去,若用有序数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的数是23,2012用什么数对表示?_作业帮
拍照搜题,秒出答案
第一排1,第二排2,3,第三排4,5,6,第四排7,8,9,10,将正整数按这样的规律排列下去,若用有序数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的数是23,2012用什么数对表示?
第一排1,第二排2,3,第三排4,5,6,第四排7,8,9,10,将正整数按这样的规律排列下去,若用有序数对(n,m)表示第n排,从左到右第m个数,如(4,3)表示实数9,则(7,2)表示的数是23,2012用什么数对表示?将正整数按如图所示的规律排列下去,若有序实数对(m,n)表示第排m,从左到右第n个数,如(4,3)表示实数8,则表示实数15的有序实数对是(5,5)表示实数2009的有序实数对是(63,56).【考点】.【专题】规律型.【分析】必须找出排列规律,再根据题意表示.【解答】解:观察图表可知:每排的数字个数就是排数;且奇数排从左到右,从小到大,而偶数排从左到右,从大到小.实数15在第5排,第5个位置,即其坐标为(5,5);2009在第63排,第56个位置,故其坐标为(63,56).故依次填(5,5);(63,56).【点评】考查类比点的坐标解决实际问题的能力和阅读理解能力,找出排列规律是此题关键.声明:本试题解析著作权属菁优网所有,未经书面同意,不得复制发布。答题:自由人老师 难度:0.47真题:3组卷:14
解析质量好中差

我要回帖

更多关于 赵钱孙李按音序排列 的文章

 

随机推荐