树和二叉树笔试题

树和二叉树笔试题
树和二叉树笔试题

树和二叉树笔试题

GSM全球移动通信系统概述

树和二叉树

学习2009-12-10 17:34:37 阅读1252 评论0 字号:大中小订阅

四、应用题

1.从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基本目的是什么,并指出树和二叉树的主要区别。【西安电子科技大学2001软件二、1(5分)】2.树和二叉树之间有什么样的区别与联系?

【西北工业大学1998一、3(4分)】【厦门大学2000五、2(14%/3分)】【燕山大学2001三、1(5分)】

3.请分析线性表、树、广义表的主要结构特点,以及相互的差异与关联。

【大连海事大学2001三(10分)】

4. 设有一棵算术表达式树,用什么方法可以对该树所表示的表达式求值?

【中国人民大学2001二、3(4分)】

5.将算术表达式((a+b)+c*(d+e)+f)*(g+h)转化为二叉树。【东北大学2000 三、1 (4分)】

6. 一棵有n(n>0)个结点的d度树, 若用多重链表表示, 树中每个结点都有d个链域, 则在表示该树的多重链表中有多少个空链域? 为什么? 【长沙铁道学院1998 四、1 (6分)】

7. 一棵二叉树中的结点的度或为0或为2,则二叉树的枝数为2(n0-1),其中n0是度为0的结点的个数。

【南京理工大学1998 六、(3分)】

类似本题的另外叙述有:

(1)若二叉树中度为1的结点数为0,则该二叉树的总分支数为2(n0-1),其中n0为叶结点数。

【西北工业大学1998 三、1(5分)】

8.一个深度为L的满K叉树有以下性质:第L层上的结点都是叶子结点,其余各层上每个结点都有K棵非空子树,如果按层次顺序从1开始对全部结点进行编号,求:

1)各层的结点的数目是多少?2)编号为n的结点的双亲结点(若存在)的编号是多少?3)编号为n的结点的第i 个孩子结点(若存在)的编号是多少?

4)编号为n的结点有右兄弟的条件是什么?如果有,其右兄弟的编号是多少?

请给出计算和推导过程。【西北工业大学1999五(10分)】【中科院自动化所1996二、1(10分)】

类似本题的另外叙述有:

(1)一棵高度为h的满k叉树有如下性质:根据结点所在层次为0;第h层上的结点都是叶子结点;其余各层上每个结点都有k棵非空子树,如果按层次自顶向下,同一层自左向右,顺序从1开始对全部结点进行编号,试问:

1)各层的结点个数是多少?(3分) 2)编号为i的结点的双亲结点(若存在)的编号是多少?(3分)

3)编号为i的结点的第m个孩子结点(若存在)的编号是多少?(3分)

4)编号为i的结点有右兄弟的条件是什么?其右兄弟结点的编号是多少?(3分)

【清华大学1999 八(12分)】

9.证明任一结点个数为n 的二叉树的高度至少为O(logn).【浙江大学2000 四、(5分)】10.有n个结点并且其高度为n的二叉树的数目是多少?

【西安电子科技大学2000计应用一、3(5分)】

11.已知完全二叉树的第七层有10个叶子结点,则整个二叉树的结点数最多是多少?

【西安电子科技大学2000计应用一、4 (5分)】

12.高度为10的二叉树,其结点最多可能为多少?【首都经贸大学1998 一、1 (4分)】13.任意一个有n个结点的二叉树,已知它有m个叶子结点,试证明非叶子结点有(m-1)个度为2,其余度为1。【西安电子科技大学2001计应用二、3 (5分)】

14. 已知A[1..N]是一棵顺序存储的完全二叉树,如何求出A[i]和A[j]的最近的共同祖先?【中国人民大学2001 二、5 (4分)】

15.给定K(K>=1),对一棵含有N个结点的K叉树(N>0)、请讨论其可能的最大高度和最小高度。

【大连海事大学2001 五、(8分)】

16.已知一棵满二叉树的结点个数为20到40之间的素数,此二叉树的叶子结点有多少个?【东北大学1999 一、1 (3分)】

17.一棵共有n个结点的树,其中所有分支结点的度均为K,求该树中叶子结点的个数。【东北大学2000 一、3 (4分)】

18.如在内存中存放一个完全二叉树,在树上只进行下面两个操作:

(1)寻找某个结点双亲(2)寻找某个结点的儿子;

请问应该用何种结构来存储该二叉树?【东北大学2001 一、3 (3分)】

19.求含有n个结点、采用顺序存储结构的完全二叉树中的序号最小的叶子结点的下标。要求写出简要步骤。【北京工业大学2000 二、3 (5分)】

20.设二叉树T中有n个顶点,其编号为1,2,3,…,n,若编号满足如下性质:

(1)T中任一顶点v的编号等于左子树中最小编号减1;

(2)对T中任一顶点v,其右子树中最小编号等于其左子树中的最大编号加1。试说明对二叉树中顶点编号的规则(按何种顺序编号)。【山东大学1992 一、1 (3分)】

21.若一棵树中有度数为1至m的各种结点数为n1,n2,…,nm(nm表示度数为m的结点个数)请推导出该树中共有多少个叶子结点n0的公式。【北京邮电大学1993二1(6分)】【西安交通大学1996四、1(5分)】【南京航空航天大学1998五(10分)】【东南大学1999一4(8分)】【山东大学1993一2(4分)】

【山东师范大学2001 二3(12分) 2001二2(15分)】

22.若一棵完全二叉树中叶子结点的个数为n,且最底层结点数≧2,则此二叉树的深度H=?【北京科技大学2001 一、6 (2分)】

23.已知完全二叉树有30个结点,则整个二叉树有多少个度为0的结点?

【山东师范大学1996五、3(2分)】

24.在一棵表示有序集S的二叉搜索树(binary search tree)中,任意一条从根到叶结点的路径将S分为3部分:在该路径左边结点中的元素组成的集合Sl;在该路径上的结点中的元素组成的集合S2;在该路径右边结点中的元素组成的集合S3。S=S1∪S2∪S3。若对于任意的a∈Sl,b∈S2,c∈S3是否总有a≤b≤c?为什么?【清华大学2000 四(10分)】【武汉大学2000 三、3】

25.试证明,在具有n(n>=1)个结点的m次树中,有n(m-1)+1个指针是空的。【复旦大学1998四(8分)】

26.对于任何一棵非空的二叉树,假设叶子结点的个数为n0,而次数为2的结点个数为n2,请给出n0和n2之间所满足的关系式n0=f(n2).要求给出推导过程。【复旦大学1998 五(8分)】

27.对于任意一棵非空的二叉树T,我们用n0表示T中叶子结点的个数,用n2表示T中有两棵非空子树的结点的个数。(1)给出n0和n2所满足的关系式。(2)证明你在(1)中给出的关系式成立。

【复旦大学1997 三(10分)】

28.试求有n个叶结点的非满的完全二叉树的高度;【中科院计算所2000 五、(5分)】29.对于具有n个叶子结点,且所有非叶子结点都有左右孩子的二叉树,

(1)试问这种二叉树的结点总数是多少?(5分)

(2)试证明=1。其中:li表示第i个叶子结点所在的层号(设根结点所在层号为1)。(10分) 【北方交通大学1995 三、(15分)】

30.假设高度为H的二叉树上只有度为0和度为2的结点,问此类二叉树中的结点数可能达到的最大值和最小值各为多少?【北京邮电大学1996 一、1 (4分)】

31.一棵满k叉树,按层次遍历存储在一维数组中,试计算结点下标的u的结点的第i个孩子的下标以及结点下标为v的结点的父母结点的下标。【北京邮电大学2001 四、4(5分)】32.二叉树有n个顶点,编号为1,2,3,… ,n,设:

* T中任一顶点V的编号等于左子树中最小编号减1;

* T中任一顶点V的右子树中的最小编号等于其左子树中的最大编号加1;

试描绘该二叉树。【东南大学1999 一、2 (7分)】

33.设T是具有n个内结点的扩充二叉树,I是它的内路径长度,E是它的外路径长度。(1)试利用归纳法证明E=I+2n, n>=0.(5分)

(2)利用(1)的结果试说明:成功查找的平均比较次数s与不成功查找的平均比较次数u 之间的关系可用公式表示s=(1+1/n)u-1,n>=1。【清华大学1998 四、(10分)】

34.一棵非空的有向树中恰有一个顶点入度为0, 其它顶点入度为1,但一个恰有一个顶点入度为0,其它顶点入度为1的有向图却不一定是一棵有向树,请举例说明。

【中科院计算所1999 三、1 (5分)】

35.试给出下列有关并查集(mfsets)的操作序列的运算结果:

union(1,2),union(3,4),union(3,5),union(1,7),union(3,6),union(8,9),

union(1,8),union(3,10),union(3,11),union(3,12),union(3,13),

union(14,15),union(16,0),union(14,16),union(1,3),union(1,14).

(union是合并运算,在以前的书中命名为merge)

要求

(1)对于union(i,j),以i作为j的双亲;(5分)

(2)按i和j为根的树的高度实现union(i,j),高度大者为高度小者的双亲;(5分)

(3)按i和j为根的树的结点个数实现union(i,j),结点个数大者为结点个数小者的双亲。(5分)

【清华大学2001 一、(15分)】

36.证明:在任何一棵非空二叉树中有下面的等式成立:叶结点的个数=二度结点的个数+1 【天津大学1999 四】

37. 对于一个堆栈,若其入栈序列为1,2,3,…,n,不同的出入栈操作将产生不同的出栈序列。其出栈序列的个数正好等于结点个数为n的二叉树的个数,且与不同形态的二叉树一一对应。请简要叙述一种从堆栈输入(固定为1,2,3……n)/输出序列对应一种二叉树形态的方法,并以入栈序列1,2,3(即n=3)为例加以说明。【浙江大学1998年五、1 (7分)】

38. 如果给出了一个二叉树结点的前序序列和对称序序列,能否构造出此二叉树?若能,请

证明之。若不能,请给出反例。如果给出了一个二叉树结点的前序序列和后序序列,能否构造出此二叉树?若能,请证明之。若不能,请给出反例。【北京大学1998 二、2 (5分)】类似本题的另外叙述有:

(1)二叉树的中序与后序序列能唯一地定义一棵二叉树吗? 这里所指序列中的符号代表树结点中的标识符吗?二叉树的前序与后序序列能唯一地定义一棵二叉树吗?为什么?【东南大学1993一、4(8分)】

39.试证明:同一棵二叉树的所有叶子结点,在前序序列。对称序序列以及后序序列中都按相同的相对位置出现(即先后顺序相同),例如前序abc,后序bca对称序bac。【山东工业大学1997 七、(10分)】

40. 由二叉树的中序序列及前序序列能唯一的建立二叉树,试问中序序列及后序序列是否也能唯一的建立二叉树,不能则说明理由,若能对中序序列DBEAFGC和后序序列DEBGFCA 构造二叉树。

【南京理工大学1998 四、(3分)】

41. 证明,由一棵二叉树的前序序列和中序序列可唯一确定这棵二叉树。设一棵二叉树的前序序列为ABDGECFH,中序序列为:DGBEAFHC 。试画出该二叉树。【浙江大学1996 六、(8分)】

类似本题的另外叙述有:

(1) 证明:由一棵二叉树的前序序列和中序序列可唯一确定这棵二叉树。

【长沙铁道学院1997五、2(10分)】

(2)证明:由二叉树的中序遍历序列和后序遍历序列可唯一地确定出该二叉树。

【华南理工大学2001 一、3 (4分)】

(3)二叉树已知其中序扫描序列和后序扫描序列如何确定这一棵二叉树,并举例说明.

【山东大学2001软件与理论二、1 (4分)】

42.试证明:仅仅已知一棵二叉树的后序遍历序列和先序遍历序列,不能唯一地确定这棵二叉树。

【大连海事大学2001 九、(8分)】

类似本题的另外叙述有:

(1) 由二叉树的前序遍历和后序遍历结果能否唯一确定一棵二叉树?解释你的论断。

【西安电子科技大学2001计应用二、4 (5分)】

(2) 假定某二叉树的前序遍历序列为ABCDEFGHIJ,后序遍历序列为CEFDBJIHGA,据此两个序列能否唯一确定此二叉树? 若不能,试画出两样具有同样上述遍历序列的二叉树.【武汉交通科技大学1996二8(3分)】

43. ①试找出满足下列条件的二叉树

1)先序序列与后序序列相同2)中序序列与后序序列相同

3)先序序列与中序序列相同4)中序序列与层次遍历序列相同

②已知一棵二叉树的中序序列和后序序列分别为DBEAFIHCG和DEBHIFGCA,画出这棵二叉树。

【东北大学1999 六、(4分)】

类似本题的另外叙述有:

(1)试画出在先根次序和中根次序下结点排列顺序皆相同的所有类型的二叉树形。

试画出在先根次序和后根次序下结点排列顺序皆相同的所有类型的二叉树形。

【吉林大学1995 四、1,2 (每题7分)】

(2)找出所有的二叉树,其结点在下列两种遍历下恰好都有同样的遍历序列。

1)先序遍历和中序遍历2)先序遍历和后序遍历【北京理工大学1999 三(6分)】

(3)找出所有的二叉树,其结点在下列两种遍历下,恰好都是以同样的顺序出现:

1)前序遍历和中序遍历。2)前序遍历和后序遍历。【南京航空航天大学1995 六(5分)】(4)试找出分别满足下列条件的所有二叉树。

1)先序序列和中序序列相同2)中序序列和后序序列相同

3)先序序列和后序序列相同【南京航空航天大学2001 二、(10分)】

(5)找出所有满足下列条件的二叉树:

1)它们在先序遍历和中序遍历时,得到的结点访问序列相同;

2)它们在后序遍历和中序遍历时,得到的结点访问序列相同;

3)它们在先序遍历和后序遍历时,得到的结点访问序列相同;【东南大学2000一、4(6分)】44.将下列由三棵树组成的森林转换为二叉树。(只要求给出转换结果)

【南京航空航天大学1998 一、(10分)】

45. 阅读下列说明和流程图,回答问题(1)和问题(2)。

说明:流程图是用来实现中序遍历,二叉树存放在数组tree中,每个数组元素存放树中一个结点,每个

结点的形式为(值,左指针,右指针),分别用tree[i].v,tree[i].l,tree[i].r来表示第i个结点的值,左指针,右指针,其中左,右指针的值为所指结点在数组中的下标,若指针的值为0,表示它指向空树,图中指针root用以指向二叉树的根结点。问题:

(1)填充流程图中的①、②、③,使其按中序遍历二叉树。

(2)把流程图中的(A)框移至哪个位置(图中Ⅰ~Ⅸ)使流程图的算法从中序遍历变成后序遍历。

【上海海运学院1997年四、(13分)】

46.设一棵二叉树的先序、中序遍历序列分别为

先序遍历序列:A B D F C E G H 中序遍历序列:B F D A G E H C

(1)画出这棵二叉树。

(2)画出这棵二叉树的后序线索树。

(3)将这棵二叉树转换成对应的树(或森林)。【南京航空航天大学1997 二、(10分)】47.已知一棵二叉树的对称序和后序序列如下:

对称序:GLDHBEIACJFK 后序:LGHDIEBJKFCA

(1) (1) (2分)给出这棵二叉树:

(2) (2) (2分)转换为对应的森林:

(3) (3) (4分)画出该森林的带右链的先根次序表示法:

Itag=

(4) (4分) 画出该森林带度数的后根次序表示法:

(5) (4分)在带度数的后根次序表示法中,不包含指针,但仍能完全反映树的结构。写出以结点x为根的子树在后根次序序列中的前驱的求法。(用语言叙述,不用写算法)【山东大学

1998 八、(16分)】

48.设某二叉树的前序遍历序列为:ABCDEFGGI,中序遍历序列为:BCAEDGHFI:

(1)试画出该二叉树;

(2)写出由给定的二叉树的前序遍历序列和中序遍历序列构造出该二叉树的算法。

(3)设具有四个结点的二叉树的前序遍历序列为abcd;S为长度等于四的由a,b,c,d排列构成的字符序列,若任取S作为上述算法的中序遍历序列,试问是否一定能构造出相应的二叉树,为什么?试列出具有四个结点二叉树的全部形态及相应的中序遍历序列。【浙江大学1997 六、(15分)】

类似本题的另外叙述有:

(1)已知二叉树的先序序列: CBHEGAF, 中序序列: HBGEACF, 试构造该二叉树

【北京理工大学2001 八、2 (4分)】

(2)已知二叉树按中序排列为BFDAEGC,按前序排列为ABDFCEG,要求画出该二叉树。【山东师范大学1996 五、1 (2分)】

(3)已知一棵二叉树的前序序列A,B,D,C,E,F,中序序列B,D,A,E,F,C. 画出这棵二叉树。【燕山大学1999 四、(5分)】

(4)已知一棵二叉树的前序遍历结果是:ABCDEFGHIJ,中序遍历的结果是:BCEDAGHJIF,试画出这棵二叉树。【厦门大学1998 六、1 (7分)】

(5)已知二叉树BT各结点的先序、中序遍历序列分别为ABCDEGF和CBAEDF,试画出该二叉树。

【北京工业大学1998 二、(6分)】

49. 假设一棵二叉树的前序序列为ABCD,它的中序序列可能是DABC吗?【石油大学1998

一、1(5分)】

类似本题的另外叙述有:

(1)一棵前序序列为1,2,3,4,的二叉树,其中序序列可能是4,1,2,3吗?设一棵二叉树的前序序列为1,2,3,4,5,6,7,8,9,其中序序列为2,3,1,5,4,7,8,6,9,试画出该二叉树。

【东南大学1996一、2 (7分) 1998 一、3】

50.一棵非空的二叉树其先序序列和后序序列正好相反,画出这棵二叉树的形状。

【西安电子科技大学2000软件一、8 (5分)】

51.已知一棵二叉树的后序遍历序列为EICBGAHDF,同时知道该二叉树的中序遍历序列为CEIFGBADH,试画出该二叉树。【重庆大学2000 二、2】

类似本题的另外叙述有:

(1)已知二叉树BT各结点的中序和后序序列分别为DFBACEG和FDBGECA,试构造出该二叉树BT,并作简要说明。【北方交通大学1997 二、(8分)】

(2)已知二叉树的中序遍历序列为G F B E A N H M,后序遍历的结点序列为G E B F H N M A ,画出此二叉树的形态。【青岛海洋大学1999 一、5(5分)】

(3)已知二叉树的后序序列为ABCDEFG 和中序序列为ACBGEDF,构造出该二叉树。【福州大学1998 三、1 (6分)】

(4)已知某二叉树的后序遍历和中序遍历如下,构造出该二叉树。

后序遍历序列:G D B E I H F C A 中序遍历序列:D G B A E C H I F

【厦门大学2000 七、1 (20%/3分)】

(5)已知一个二分树的中序序列和后序序列如下:

中序:A B C D E F G H I J 后序:A C D B H J I G F E

试画出此二分树的结构。【首都经贸大学1998 二、1 (10分)】

52.假设一棵二叉树的层次序列为ABCDEFGHIJ,中序序列DBGEHJACIF。请画出这棵二叉树。

【武汉大学2000 三、1】【东南大学2000 一、1 (6分)】

类似本题的另外叙述有:

(1)假设一棵二叉树的层次次序(按层次递增顺序排列,同一层次自左向右)为ABECFGDHI,中序序列为BCDAFEHIG。请画出该二叉树,并将其转换为对应的森林。【山东大学2001 四、(6分)】

53. 已知一个森林的先序序列和后序序列如下,请构造出该森林。

先序序列:ABCDEFGHIJKLMNO

后序序列:CDEBFHIJGAMLONK 【合肥工业大学2000 四、1 (5分)】

54.画出同时满足下列两条件的两棵不同的二叉树。

(1)按先根序遍历二叉树顺序为ABCDE。

(2)高度为5其对应的树(森林)的高度最大为4。【东北大学1997 一、3 (5分)】55.用一维数组存放的一棵完全二叉树;ABCDEFGHIJKL。请写出后序遍历该二叉树的访问结点序列。

【西安电子科技大学1999计应用一、6 (5分)】

56.一棵二叉树的先序、中序、后序序列如下,其中一部分未标出,请构造出该二叉树。先序序列:_ _ C D E _ G H I _ K

中序序列:C B _ _ F A _ J K I G

后序序列:_ E F D B _ J I H _ A 【厦门大学2002 七、1 (6分)】

类似本题的另外叙述有:

(1)一棵二叉树的先序、中序和后序序列分别如下,其中有一部分为显示出来。试求出空格处的内容,并画出该二叉树。

先序序列: _ B F I C E H G

中序序列:D K F I A E J C

后序序列: K F B H J G A 【西安电子科技大学2000计应用五、2 (5分)】(2)已知一棵二叉树的先序中序和后序序列如下,其中空缺了部分,请画出该二叉树。先序:_ B C _ E F G _ I J K _

中序:C B E D _ G A J _ H _ L

后序:_ E _ F D _ J _ L _ H A 【合肥工业大学2001 四、1 (5分)】

(3)已知含有8个结点的一棵二叉树,按先序、中序、后序进行遍历后,有些结点序号不清楚如下图示。要求构造出一棵符合条件的二叉树。

先根序遍历_ 2 3 _ 5 _ 7 8

中根序遍历 3 _ 4 1 _ 7 8 6

后根序遍历_ 4 2 _ _ 6 5 1 【东北大学1996 一、3 (5分)】

57.M 叉树的前序和后序遍历分别与由它转换成的二叉树的哪种遍历相对应?

【中国人民大学2000 一、2 (4分)】

58.证明:在二叉树的三种遍历序列中,所有叶子结点间的先后关系都是相同的。要求每步论断都指出根据。【北京工业大学2001 二、3 (5分)】

59. 下表中M﹑N分别是一棵二叉树中的两个结点,表中行号i=1,2,3,4分别表示四种M﹑N的相对关系,列号j=1,2,3分别表示在前序、中序、后序遍历中M,N之间的先后次序关系。要求在i,j所表示的关系能够发生的方格内打上对号。例如:如果你认为n是m 的祖先,并且在中序遍历中n能比m先被访问,则在(3,2)格内打上对号

二叉树的建立及其应用程序代码

#include #include #include #include typedef char elemtype; typedef struct tree //二叉树结构体 { elemtype data; struct tree *lchild; struct tree *rchild; }TREE; TREE *createbitree() //递归建立二叉树{ char ch; TREE *p; ch=getchar(); if (ch=='#') p=NULL; else { p=(TREE *)malloc(sizeof(TREE)); p->data=ch; p->lchild=createbitree(); p->rchild=createbitree(); } return p; } void preorder(TREE *p) //前序遍历 { if(p!=NULL) { printf("%c ",p->data); preorder(p->lchild); preorder(p->rchild); } } void inorder(TREE *p) //中序遍历 { if (p!=NULL)

{ inorder(p->lchild); printf("%c ",p->data); inorder(p->rchild); } } void postorder(TREE *p) //后序遍历 { if (p!=NULL) { postorder(p->lchild); postorder(p->rchild); printf("%c ",p->data); } } void shu(TREE *p,int len) //数的形状{ if (p!=NULL) { shu(p->lchild,len+1); for (int i=1;i<=4*len;i++) { printf(" "); } printf("%c",p->data); printf("------\n"); shu(p->rchild,len+1); } } int shendu(TREE *p) //计算深度 { int l,r; if (p==NULL) { return 0; } l=shendu(p->lchild)+1; r=shendu(p->rchild)+1; if (l>=r) //左右子树比较return l; else

实验三 二叉树的操作及应用

实验三二叉树的操作及应用 实验课程名:数据结构与算法 专业班级:15计科1班学号:201540410109 姓名:刘江 实验时间:2016.10.24-10.31 实验地点:K4-102 指导教师:冯珊 成绩: 一、实验目的及要求 1、进一步掌握指针变量、动态变量的含义。 2、掌握二叉树的结构特性,以及各种存储结构的特点和适用范围。 3、掌握用指针类型描述、访问和处理二叉树的运算。 二、实验内容 任务一:完成下列程序,该程序以二叉链表作存储结构,构建如图1所示的二叉树, 并依次进行二叉树的前序、中序、后序及层次遍历。 图1 解答: (1)源代码:#include #include #define OK 1 #define ERROR 0 typedef char DataType; /* 二叉树节点的存储类型 */ typedef struct Node //define stricture BiTree { DataType data; struct Node *lchild,*rchild; }Node, *BiTree; /*按先序序列建立一棵二叉树*/ BiTree CreatBiTree(BiTree &T) { DataType ch; scanf("%c",&ch); if(ch==' ') {T=NULL;}

else { if(!(T=(Node*)malloc(sizeof(Node)))){printf("Overflow.\n") ;exit(0);} T->data =ch; CreatBiTree(T->lchild ); CreatBiTree(T->rchild ); } return T; } void PrintData(DataType x) { printf("%c",x); } void PreOrder(BiTree T, void (*Visit)( DataType item)) /*前序遍历二叉树T,访问操作为Visit()函数*/ { if(T!= NULL) { Visit(T->data); PreOrder(T->lchild, Visit); PreOrder(T->rchild, Visit); } } void InOrder(BiTree T, void (*Visit)( DataType item)) /*中序t */ { if(T!= NULL) { InOrder(T->lchild, Visit); Visit(T->data); InOrder(T->rchild, Visit); } } void PostOrder(BiTree T, void (*Visit)( DataType item)) /*后序 */ { if(T!= NULL) { PostOrder(T->lchild, Visit); PostOrder(T->rchild, Visit); Visit(T->data); }

数据结构二叉树实验报告

实验三二叉树的遍历 一、实验目的 1、熟悉二叉树的结点类型和二叉树的基本操作。 2、掌握二叉树的前序、中序和后序遍历的算法。 3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。 二、实验环境 运行C或VC++的微机。 三、实验内容 1、依次输入元素值,以链表方式建立二叉树,并输出结点的值。 2、分别以前序、中序和后序遍历二叉树的方式输出结点内容。 四、设计思路 1. 对于这道题,我的设计思路是先做好各个分部函数,然后在主函数中进行顺序排列,以此完成实验要求 2.二叉树采用动态数组 3.二叉树运用9个函数,主要有主函数、构建空二叉树函数、建立二叉树函数、访问节点函数、销毁二叉树函数、先序函数、中序函数、后序函数、范例函数,关键在于访问节点 五、程序代码 #include #include #include #define OK 1 #define ERROR 0 typedef struct TNode//结构体定义 {

int data; //数据域 struct TNode *lchild,*rchild; // 指针域包括左右孩子指针 }TNode,*Tree; void CreateT(Tree *T)//创建二叉树按,依次输入二叉树中结点的值 { int a; scanf("%d",&a); if(a==00) // 结点的值为空 *T=NULL; else // 结点的值不为空 { *T=(Tree)malloc(sizeof(TNode)); if(!T) { printf("分配空间失败!!TAT"); exit(ERROR); } (*T)->data=a; CreateT(&((*T)->lchild)); // 递归调用函数,构造左子树 CreateT(&((*T)->rchild)); // 递归调用函数,构造右子树 } } void InitT(Tree *T)//构建空二叉树 { T=NULL; } void DestroyT(Tree *T)//销毁二叉树 { if(*T) // 二叉树非空 { DestroyT(&((*T)->lchild)); // 递归调用函数,销毁左子树 DestroyT(&((*T)->rchild)); // 递归调用函数,销毁右子树 free(T); T=NULL; } } void visit(int e)//访问结点 { printf("%d ",e); }

二叉树的应用研究

二叉树的应用研究 苏雨洁 (盐城工学院优集学院江苏盐城224001) 摘要:课堂上学习可以知道,二叉树可以简单明了的表示很多繁琐的信息数据。同时,二叉树在有很多方面有具体的应用。通过搜集各方面的资料发现,越来越多的领域开始选择使用二叉树模型来进行设计投资决策,并以此为平台,实现了很多的功能,本文结合了多领域的知识,给出了在生活方面,学习方面,以及理财投资方面的多种实例,并且加以概括和介绍。 关键词:二叉树;数据结构;结点;数组;期权 Study on the application of the binary tree SU Yujie (UGS College, Yancheng Institute of Technology, Yancheng, Jiangsu 224001) Abstract: Through learning in the classroom we can know, binary tree can be simple and clear to show many complicated data.At the same time,binary tree have specific applications in many aspects.Through the collection of information in many aspects,we can find that more and more fields start to use the binomial tree model to design,invest and making descisions. Use it as a platform ,achieving a lot of functions. This article incorporates knowledge from many fields and show a variety of examples in the aspects of living, learning, and financial investment.And summarize and introduce. Key words: Binary tree;Data structure; Node; Array; Option 0引言 在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。逻辑上二叉树有五种基本形态:空二叉树,只有一个根结点的二叉树,右子树为空的二叉树,左子树为空的二叉树,完全二叉树;本文根据二叉树的性质形态,研究了二叉树在各个领域的应用实例,并且展望了二叉树在更多领域的应用。 1二叉树在学习上的应用 1.1二叉树平面坐标网及其应用 平面坐标系是把平面上的点映射为一对有序实数,坐标系是形数结合的桥梁。在图形,图像处理中,要处理的点数很多,能都有效的表示点就成为能否有效地处理图形图像的基本问题。数学上普遍使用切分方法,把一个复杂的几何对象近似表示成简单的几何对象的几何,集合中简单的几何对象位置就由其特征点(或点集)的坐标决定。把复杂的几何对象近似的

二叉树的遍历和应用

内蒙古科技大学 本科生课程设计说明书 题目:数据结构课程设计 ——二叉树的遍历和应用 学生姓名: 学号: 专业: 班级: 指导教师: 2013年5月29日

内蒙古科技大学课程设计说明书 内蒙古科技大学课程设计任务书 I

内蒙古科技大学课程设计说明书 目录 内蒙古科技大学课程设计任务书..............................................................错误!未定义书签。目录....................................................................................................................................II 第一章需求分析 (3) 1.1课程设计目的 (3) 1.2任务概述 (3) 1.3课程设计内容 (3) 第二章概要设计 (5) 2.1设计思想 (5) 2.2二叉树的遍历 (5) 2.3运行界面设计 (6) 第三章详细设计 (7) 3.1二叉树的生成 (7) 3.2二叉树的先序遍历 (7) 3.3 二叉树的中序遍历 (8) 3.4二叉树的后续遍历 (8) 3.5主程序的设计 (8) 第四章测试分析 (11) 4.1二叉树的建立 (11) 4.2二叉树的先序、中序、后序遍历 (11) 第五章课程设计总结 (12) 附录:程序代码 (13) 致谢 ···········································································································错误!未定义书签。 II

数据结构实验二叉树

实验六:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境 PC微机 DOS操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; 4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、测试数据 1、输入数据:*(+)3 正确结果: 2、输入数据:(1+2)*3+(5+6*7);

正确输出:56 七、表达式求值 由于表达式求值算法较为复杂,所以单独列出来加以分析: 1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。 例如有如下的中缀表达式: a+b-c 转换成后缀表达式为: ab+c- 然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。 2、求值过程 一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,并以字符串的 形式保存。 二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括 号处理掉。 三、计算后缀表达式的值。 3、中缀表达式分解 DivideExpressionToItem()函数。分解出原始中缀表达式中的操作数、操作符以及括号,保存在队列中,以本实验中的数据为例,分解完成后队列中的保存顺序如下图所示:

实验二叉树及其应用(严选材料)

实验6:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 1、 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算 a) 统计叶子结点的个数。 b) 求二叉树的深度。 2、 十进制的四则运算的计算器可以接收用户来自键盘的输入。 3、 由输入的表达式字符串动态生成算术表达式所对应的二叉树。 4、 自动完成求值运算和输出结果。 四、实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; - + / a * b - e f C d

4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、功能分析 存储结构 typedef union{ int Operator; // 操作符 float Operand; // 操作数 }Int_Float; //表达式树 typedef struct BinaryTreeNode{ Int_Float Data; //数据域 int IsOperator; //判断是不是操作数的标志位 struct BinaryTreeNode *RChild;//左子树 struct BinaryTreeNode *LChild;//右子树 }BiTreeNode, *lpBiTreeNode; //栈的定义 typedef struct { lpBiTreeNode *base; lpBiTreeNode *top; int stacksize; }SqStack; 函数一览表 lpBiTreeNode GetTop( SqStack s );//取栈顶结点函数 int IsEmpty( SqStack s );//判空函数 int InitStack( SqStack &s );//初始化栈函数 int Pop( SqStack &s, lpBiTreeNode &e );//出栈函数 int Push( SqStack &s, lpBiTreeNode e );//入栈函数 int In( int c, int* op );// 判断c是否在op中 int Precede( int theta1, int theta2 );//比较运算符号的优先级 int isNum( int c );//判断是不是数 int GetInput(Int_Float *Result);//读入输入的数 lpBiTreeNode CreateBiTree();//创建二叉树 bool calculate(lpBiTreeNode Root, float *result);//计算二叉树化表达式的值int getLeafNum(lpBiTreeNode Root);//计算二叉树的叶子结点数

树和二叉树实验报告

树和二叉树 一、实验目的 1.掌握二叉树的结构特征,以及各种存储结构的特点及适用范围。 2.掌握用指针类型描述、访问和处理二叉树的运算。 二、实验要求 1.认真阅读和掌握本实验的程序。 2.上机运行本程序。 3.保存和打印出程序的运行结果,并结合程序进行分析。 4.按照二叉树的操作需要,重新改写主程序并运行,打印出文件清单和运 行结果。 三、实验内容 1.输入字符序列,建立二叉链表。 2.按先序、中序和后序遍历二叉树(递归算法)。 3.按某种形式输出整棵二叉树。 4.求二叉树的高度。 5.求二叉树的叶节点个数。 6.交换二叉树的左右子树。 7.借助队列实现二叉树的层次遍历。 8.在主函数中设计一个简单的菜单,分别调试上述算法。 为了实现对二叉树的有关操作,首先要在计算机中建立所需的二叉树。建立二叉树有各种不同的方法。一种方法是利用二叉树的性质5来建立二叉树,输入数据时要将节点的序号(按满二叉树编号)和数据同时给出:(序号,数据元素0)。另一种方法是主教材中介绍的方法,这是一个递归方法,与先序遍历有点相似。数据的组织是先序的顺序,但是另有特点,当某结点的某孩子为空时以字符“#”来充当,也要输入。若当前数据不为“#”,则申请一个结点存入当前数据。递归调用建立函数,建立当前结点的左右子树。 四、解题思路 1、先序遍历:○1访问根结点,○2先序遍历左子树,○3先序遍历右子树 2、中序遍历:○1中序遍历左子树,○2访问根结点,○3中序遍历右子树 3、后序遍历:○1后序遍历左子树,○2后序遍历右子树,○3访问根结点 4、层次遍历算法:采用一个队列q,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进后出,所以能够达到按层次遍历二叉树的目的。 五、程序清单 #include #include #define M 100

二叉树实验报告

重庆交通大学综合性设计性实验报告 班级:软件开发专业 2010级一班 实验项目名称:二叉树 实验项目性质:设计性实验 实验所属课程:数据结构 实验室(中心): 6教 指导教师:鲁云平 实验完成时间: 2012 年 4 月 29 日

一、实验目的 主要完成以下功能: 1. 建立二叉树 2. 计算结点所在的层次 3 .统计结点数量和叶结点数量 4. 计算二叉树的高度 5. 计算结点的度 6. 找结点的双亲和子女 7. 二叉树的遍历 8. 二叉树的输出等等 二、实验内容及要求 1.二叉树的结点结构,二叉树的存储结构由学生自由选择和设定 2.实验完成后上交打印的实验报告,报告内容与前面所给定的实验模板相同 3.将实验报告电子版和源代码在网络教学平台提交 三、实验设备及软件 Visual studio 2010

四、设计方案 ㈠题目(老师给定或学生自定) 二叉树的简单应用 ㈡设计的主要思路 通过递归原理实现大部分遍历二叉树功能 ㈢主要功能 1. 建立二叉树 2. 计算结点所在的层次 3 .统计结点数量和叶结点数量 4. 计算二叉树的高度 5. 计算结点的度 6. 找结点的双亲和子女 7. 二叉树的遍历 8. 二叉树的输出 五、主要代码 栈头文件:stack.h class Stack { public: Stack(int sz=100); ~Stack(){delete[]elements;} void Push(const T &x); bool Pop(T &x); bool getTop(T &x); bool IsEmpty()const{return(top==-1)?true:false;} bool IsFull()const{return(top==maxSize-1)?true:false;} private: T *elements; int top;

实验3 树和二叉树

实验3 树和二叉树 实验性质:验证性 实验学时:4学时 一、实验目的 1.掌握二叉树的特点、在计算机中的存储表示方法及其基本操作的实现; 2.能够利用二叉树求解一些常见问题。 二、实验预备知识 1.阅读并掌握二叉树二叉链表存储方法的类型定义及其创建、遍历等基本操作。 2.阅读并掌握赫夫曼树的创建、赫夫曼编码的求得等基本操作。 三、实验内容 1.理解并用二叉链表的操作运行下列程序: #include using namespace std; #include "Status.h" typedef char ElemType; #include "BiTree.h" void main() { BiTree T; CreateBiTree(T); cout<<"二叉树的深度为:"<

数据结构—最优二叉树及其应用

实验一最优二叉树及其应用 1.程序设计简介 本实验程序用于验证最优二叉树的算法。树的存储采用带孩子的双亲顺序存储方法。2.源程序 //最优二叉树 #include #include using namespace std; //定义结点类型 template struct hufnode { T wei;//权值 int prt;//指向父结点的指针域(结点元素的下标) int lch;//左指针域(结点元素的下标) int rch;//右指针域(结点元素的下标) }; //由于数组下标一般是非负数整数,因此可以用-1作为空指针值 template class huffman_BT { int nn;//叶子结点的个数 hufnode*BT;//最优二叉树顺序存储空间的首地址 public: huffman_BT(){BT=NULL;}//构造函数,对最优二叉树进行初始化 void creat_hufm_BT(int n,T w[]);//生成最优二叉树 void select(hufnode*p,int k,int *i,int *j); void prt_hufm_BT();//输出最优二叉树存储空间状、 }; //生成最优二叉树 template void huffman_BT::creat_hufm_BT(int n,T w[]) {//n是叶子结点的个数,w是叶子结点的权值数组 hufnode *p; int k,i,j,m; nn=n; m=n*2-1; BT=new hufnode[m];//申请最优二叉树存储空间 p=BT; for(k=0;kprt=-1;

实验三树和二叉树

《数据结构》实验报告三 学院:班级: 学号:姓名: 日期:2010.04.29 程序名:L61.CPP,L62.CPP 一、上机实验的问题和要求: 要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。具体实现要求: 1.基于先序遍历的构造算法:输入是二叉树的先序序列,但必须在其中加入虚结点以示空 指针的位置。假设虚结点输入时用空格字符表示。 2.用广义表表示所建二叉树。 3.用凹入表表示所建二叉树。 4.分别利用前序遍历、中序遍历、后序遍历所建二叉树。 5.求二叉树结点总数,观察输出结果。 6.求二叉树叶子总数,观察输出结果。 7.交换各结点的左右子树,用广义表表示法显示新的二叉树。 8.(★)二叉树采用链接存储结构,其根结点指针为T,设计一个算法对这棵二叉树的每 个结点赋值:(注意要修改DataType类型) ?叶结点的值为3 ?只有左孩子或右孩子的结点则其值分别等于左孩子或右孩子的值 ?左、右孩子均有的结点,则其值等于左、右孩子结点的值之和 ?用广义表表示法显示所建二叉树 阅读理解建立Huffman树的算法,对该算法进行运行及调试。具体实现要求: 1.调试并运行Huffman算法,验算《回家作业六》的第3题。 2.(★)求Huffman树的带权路径长度WPL。 二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 三、源程序及注释: #include #include

//二叉树的链式存储表示 typedef char DataType; //应由用户定义DataType的实际类型typedef struct node { DataType data; struct node *lchild, *rchild; //左右孩子指针 } BinTNode; //结点类型 typedef BinTNode *BinTree; void main() { void ListBinTree(BinTree T); //用广义表表示二叉树 void DisplayBinTree(BinTree T); //用凹入表表示二叉树 void CreateBinTree(BinTree *T); //构造二叉链表 void Preorder(BinTree T); //前序遍历二叉树 void Inorder(BinTree T); //中序遍历二叉树 void Postorder(BinTree T); //后序遍历二叉树 int nodes(BinTree T); //计算总结点数 int leafs(BinTree T); //计算总叶子数 BinTree swap(BinTree T); //交换左右子树 BinTree T; printf("请输入先序序列(虚结点用空格表示):\n"); CreateBinTree(&T); ListBinTree(T); printf("\n"); DisplayBinTree(T); printf("前序遍历:\n"); Preorder(T); printf("\n"); printf("中序遍历:\n"); Inorder(T); printf("\n"); printf("后序遍历:\n"); Postorder(T); printf("\n"); printf("二叉树的总结点数为%d\n",nodes(T)); printf("二叉树的总叶子结点数为%d\n",leafs(T)); T=swap(T); ListBinTree(T); printf("\n"); } /*构造二叉链表*/ void CreateBinTree(BinTree *T) {

二叉树实验报告

题目: 编程实现二叉查找树的建立、中序遍历、元素查找等功能,要求解释实现过程及演示实际例子的运行结果。 算法描述: 首先创建二叉树结点类,其主要包括:二叉树结点数据域,指向左、右子树的指针,构造函数,设置当前结点左、右子树、数据域以及判断当前结点是否为叶子结点等。然后进行二叉树类定义,其私有部分为定义二叉树根结点指针,公有部分主要包括:构造函数、析构函数、判断二叉树是否为空树、先,中,后序遍历的递归与非递归、二叉树删除、层序遍历以及二叉树搜索等。接下来将对一些重要函数算法进行描述: 1、isLeaf函数:若该结点的左子树和右子树都为空,则为叶子结点。 2、isEmpty函数:根结点为空则为空树。 3、Parent函数:首先判断给定结点是否有双亲,根结点和空结点一定无双亲,初始化一个临时变量,用于跟进查找双亲结点,查找到后其保存的便是双亲结点。先递归在左子树中查找,如果找到,便结束递归且返回双亲结点指针;如果没有找到,再递归在右子树中查找。如果都没有找到,说明给定结点的双亲结点不在该二叉树中。 4、LeftSibling(RightSibling)函数:首先找到当前结点的双亲,然后判断双亲结点左右子树是否为空,其中必然有一个不为空,返回另一个子树指针即可。 5、DeleteBinaryTree函数:首先判断是否为空树,若为空,则返回,然后递归删除左子树,递归删除右子树,最后删除根结点。 6、PreOrder函数:首先判断是否为空树,若为空,则返回,然后访问根结点,递归遍历左子树,递归遍历右子树,结束。 7、PreOrderWithoutRecusion函数:使用栈来模拟递归过程,首先申请栈,用于保存结点指针序列,申请指针pointer保存当前根指针,然后判断栈是否为空,若栈为空且pointer为空,跳出函数,否则若pointer不为空,访问pointer所指结点,pointer入栈,pointer指向其左子树;若pointer为空,弹出栈顶元素赋给pointer,pointer指向其右子树,结束。 8、CreateTree函数:采用先序遍历序列构造二叉树,设‘0’为空结点,输入非‘0’数,生成新结点,递归创建左子树和右子树。 9、Search函数:采用先序遍历查找给定元素是否在二叉树中,首先判断树是否是空树,若是空树,则返回空指针。然后初始化临时指针temp,查找成功后temp即为所给元素所在

数据结构之树和二叉树的应用

第六章树和二叉树的应用 6.1二叉排序树和平衡二叉树 在实际应用中,常常需要在一组记录中检索一个记录,向其中插入一个记录或者把找到的记录删除。 如果记录无序,查找起来将会很慢。如果记录有序,查找将会很快。但是遇到动态增减变化时,需要移动大量的元素。即使使用链表结构,查找起来也相当麻烦。非常需要一中插入、删除、和检索记录效率都很高的数据组织方法。二叉排序(查找、搜索)树就是这样一种高效的数据结构。 二叉排序树也称二叉查找树或二叉搜索树。它或者是一棵空树; 或者有性质: (1)若其左子树不空,则左子树上所有结点的值均小于根结点 的值。 (2)若其右子树不空,则右子树上所有结点的值均大于根结点 的值。 (3)左右子树也为二叉排序树。 图5.21就是一棵二叉排序树。二叉排序树通常采用二叉链存储结构。二叉链存储结构的结点类型定义: typedefstructtnode { KeyTypekey;//关键字域 ElemTypedata;//其他数据域 structtnode*lchild,*rchild;//指针 }BSTNode; 中序遍历二叉排序树可以得到有序序列。 6.1.2二叉排序树的基本运算 二叉排序树的基本运算如下: 1.BSTSearch(bt,k)在二叉排序树bt中,查找值为k的结点。 2.BSTInsert(bt,k)在二叉排序树bt中,插入值为k的结点。 3.CreateBST(bt,str,n)创建二叉排序树 4.输出二叉排序树DispBST(bt) 5.删除结点BSTDelete(bt,k) 1.查找结点BSTSearch(bt,k) 方法:将给定值k与查找树的根结点关键码比较。若相等,查找成功,结束查找过程。否则,a.当给k小于根结点关键码,查找将在以左子女为根的子树上继续进行; b.当给k大于根结点关键码,查找将在以右子女为根的子树上继续进行;

二叉树在C语言中的实现与应用详解

/************************************************************************/ 二叉树在C语言中的实现与应用 /************************************************************************/ #include #include #define STACK_MAX_SIZE 30 #define QUEUE_MAX_SIZE 30 #ifndef elemType typedef char elemType; #endif /************************************************************************/ /* 以下是关于二叉树操作的11个简单算法 */ /************************************************************************/ struct BTreeNode{ elemType data; struct BTreeNode *left; struct BTreeNode *right; }; /* 1.初始化二叉树 */ void initBTree(struct BTreeNode* *bt) { *bt = NULL; return; } /* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */ void createBTree(struct BTreeNode* *bt, char *a) { struct BTreeNode *p; struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */ int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */ int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */ int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */ *bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */ /* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */ while(a[i] != '\0'){ switch(a[i]){ case ' ': break; /* 对空格不作任何处理 */ case '(': if(top == STACK_MAX_SIZE - 1){ printf("栈空间太小!\n"); exit(1); }

数据结构课程实验(树和二叉树的建立和应用)

实验四 二叉树的建立和应用 1、实验目的 (1)熟练掌握树的基本概念、二叉树的基本操作及在链式存储结构上的实现; (2)重点掌握二叉树的生成、遍历及求深度等算法; (3)掌握运用递归方式描述算法及编写递归C 程序的方法,提高算法分析和程序设计能力。 2、实验内容 按照已知二叉树,从键盘读入节点字符,建立二叉树(ABD#G###CE##FH###) ;分别采用先序、中序、后序遍历该二叉树,分别输出遍历结果。 3、实验步骤 (1)仔细分析实验内容,给出其算法和流程图; (2)用C 语言实现该算法; (3)给出测试数据,并分析其结果; (4)在实验报告册上写出实验过程。 4、测试数据 先序序列: ABDGCEFHjfkdkfakf 中序序列: DGBAECHF 后序序列: GDBEHFCA 5、结构定义 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; 6、实验报告要求 实验报告要求书写整齐,步骤完整,实验报告格式如下: 1、[实验目的] 2、[实验设备] 3、[实验步骤] 4、[实验内容] 5、[实验结果(结论)] G H B C D E F A

程序如下: #include "stdio.h" #include "string.h" typedef char TElemType ; typedef struct BiNode { TElemType data; struct BiNode * lchild ,* rchild; }BiNode ,*BiTree; BiTree CreateBiTree(BiTree bt) { char ch; B iTree h=NULL; c h=getchar(); i f(ch=='#') bt=NULL; e lse { if((bt=(BiNode *)malloc(sizeof(BiNode)))==NULL) exit(-2); bt->data=ch; bt->lchild=CreateBiTree(h); bt->rchild=CreateBiTree(h); } r eturn(bt); } void PreOrderTraverse(BiTree bt)

数据结构实验报告-树与二叉树

福建农林大学计算机与信息学院实验报告 树与二叉树 一、实验目的和要求 1)进一步掌握指针变量、动态变量的含义。 2)掌握二叉树的结构特性及各种存储结构的特点及适用范围。 3)掌握用指针类型描述、访问和处理二叉树的运算。 4)熟悉各种存储结构的特征及如何应用树结构解决具体问题。 二、实验内容和原理 实验内容: 编写程序实现交换二叉树中所有结点的左右子树的算法。 实验原理: 【问题描述】建立一棵二叉树,按层次遍历该二叉树,并实现将二叉树中所有结点的左右子树交换,显示其结果。 【基本要求】从键盘接受输入点(按层次遍历顺序),以“#”号结束,以二叉链表作为存储结构,将其二叉树中所有结点的左右子树交换,并将结果输出。 【实现】交换二叉树中所有结点的左右子树的具体步骤如下: ①将根结点进指针栈seqstack; ②当指针栈不空时,从栈顶取结点,如果此结点的左右孩子不为 空,则把其左右孩子交换,然后再分别将其左右孩子进栈; ③反复执行步骤②,直至指针栈为空时止。

三、实验环境 Windows XP系统 visual c++6.0 四、算法描述及实验步骤 #include "stdio.h" #include"stdlib.h" #define MAXSIZE 100 typedef char elemtype; typedef struct btnode {elemtype data; struct btnode *lchild, *rchild; }bitnode ,*bitree; typedef struct nodd {bitree addr; int parent; }sequre; bitree ins_node (bitree s,bitree t); void print_tree(bitree t); bitree creat_ordbt(); sequre seq[MAXSIZE]; void swap(bitree tree); int n=0; void main() {bitree tree; tree=creat_ordbt(); swap(tree); printf("输出交换后的二叉树\n"); print_tree(tree); } bitree creat_ordbt() {bitree t,s; elemtype x; t=NULL; printf("请按层次输入结点1的值(以#号结束,0号为空的结点):"); scanf("%c",&x); getchar(); while(x!='#') {n++;

相关文档
最新文档