树与二叉树的练习题

树与二叉树的练习题
树与二叉树的练习题

习题

一、选择题

1.有一“遗传”关系:设x是y的父亲,则x可以把它的属性遗传给y。表示该遗传关系最适合的数据结构为()。

A.向量

B.树 C图 D.二叉树

2.树最合适用来表示()。

A.有序数据元素 B元素之间具有分支层次关系的数据

C无序数据元素 D.元素之间无联系的数据

3.树B的层号表示为la,2b,3d,3e,2c,对应于下面选择的()。

https://www.360docs.net/doc/4d17968258.html,(2b(3d,3e),2c)

B.a(b(D,e),c)

C.a(b(d,e),c)

D.a(b,d(e),c)

4.高度为h的完全二叉树至少有()个结点,至多有()个结点。

A.2h_l

B.h C.2h-1 D.2h

5.在一棵完全二叉树中,若编号为f的结点存在右孩子,则右子结点的编号为()。

A.2i

B.2i-l

C.2i+l

D.2i+2

6.一棵二叉树的广义表表示为a(b(c),d(e(,g(h)),f)),则该二叉树的高度为 ()。

A.3

B.4

C.5

D.6

7.深度为5的二叉树至多有()个结点。

A.31

B.32

C.16

D.10

8.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为()个。

A.15

B.16

C.17

D.47

9.题图6-1中,()是完全二叉树,()是满二叉树。

10.在题图6-2所示的二叉树中:

(1)A结点是

A.叶结点 B根结点但不是分支结点

C根结点也是分支结点 D.分支结点但不是根结点

(2)J结点是

A.叶结点 B.根结点但不是分支结点

C根结点也是分支结点 D.分支结点但不是根结点

(3)F结点的兄弟结点是

A.E

B.D C.空 D.I

(4)F结点的双亲结点是

A.A

B.B

C.C

D.D

(5)树的深度为

A.1

B.2

C.3

D.4

(6)B结点的深度为

A.1

B.2

C.3

D.4

(7)A结点所在的层是

A.1

B.2

C.3

D.4

11.在一棵具有35个结点的完全二叉树中,该树的深度为()。

A.5

B.6

C.7

D.8

12.一棵有124个叶结点的完全二叉树,最多有()个结点。

A.247 B.248 C.249 D.250

13.用顺序存储的方法将完全二叉树中所有结点逐层存放在数组R[1,n]中,结

点R[i]若有左子树,则左子树是结点()。

A.R[2i+l]

B.R[2i]

C.R[i/2]

D.R[2i-1]

14.在一非空二叉树的中序遍历序列中,根结点的右边()。

A.只有右子树上的所有结点

B.只有右子树上的部分结点

C.只有左子树上的部分结点

D.只有左子树上的所有结点

15.一棵度为m的树中,有ni个度为1的结点,有n2个度为2的结点……,有nm个度为m的结点,则该树的叶结点数为()。

A.n1+n2+...+nm

B.(m-l)nm+...+n2+1

C.n1+n2+1

D.nl-n2

16.已知某二叉树的中序遍历序列是debac,后序遍历序列是dabec,它的前序遍历序列是()。

A.acbed

B.decab

C.deabc

D.cedba

17.在一棵二叉树的二叉链表中,空指针域等于所有非空指针域数加()。

A.2

B.1

C.0

D.-1

18.线索二叉树是一种()结构。

A.逻辑 B.逻辑和存储 C.物理 D.线性

19.由权值分别是8,7,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长

度为()。

A.23

B.37 C.46 D.43

20.设T是哈夫曼树,具有5个叶结点,树T的高度最高可以是()。

A.2

B.3

C.4

D.5

二、填空题

1.对于一棵具有n个结点的树,该树中所有结点的度数之和为____。

2.在树型结构中,树根结点没有____结点,其余每个结点有且只有____个前驱

结点:叶子结点没有____结点,其余每个结点可以有____后继结点。

3.有一棵树如题图6-3所示,回答下面的问题。

这棵树的根点是____;叶子结点是____;结点k3的度是____;结点k3的

子女是____;结点k3的父结点是____;这棵树的度为____;这棵树的深度是

____。

4.假定一棵树的广义表表示为A(B(E),C(F(H,I,J,G),D),则该树的度为

____,树的深度为____,终端结点的个数为____,单分支结点的个数为____,

双分支结点的个数为____,3分支结点的个数为____,C结点的双亲结点为____,其孩子结点为____。

5.一棵深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余

各层上的每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1

开始对全部结点编号,则:

(1)第i层结点数目是____。

(2)编号为n的结点的双亲结点(若存在)的编号是____。

(3)编号为n的结点的第i个孩子结点(若存在)的编号是____。

(4)编号为n的结点有右兄弟的条件是____:其右兄弟的编号是____。

6.前序遍历一棵树相当于____树中对应的二叉树,后序遍历一棵树则相当于树中对应的二叉树。

7.二叉树的遍历分为____,树与森林的遍历包括____。

8.一棵二叉树的第i(i>=1)层最多有____个结点;一棵有n(n>0)个结点的满二叉树共有____个叶子和____个非终端结点。

9.在一棵二叉树中,假定双分支结点数为5个,单分支结点数为6个,则叶子

结点为____个。

10.在一棵二叉树中,第五层上的结点数最多为____。

11.对于一棵具有n个结点的二叉树,当进行链接存储时,其二叉链表中的指针域的总数为____个,其中____个用于链接孩子结点,____个空闲着。

12.前序遍历的顺序是ABDGEHICFJ,则二叉树的根是____。

13.从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是____

14.结点最少的树为____,结点最少的二叉树为____。

15.一棵完全二叉树按层次遍历的序列为ABCDEFGHI,则在前序遍历中结点E的

直接前驱为____,后序遍历中结点B的直接后继是____。

16.某二叉树的中序遍历序列为ABCDEFG,后序序列为BDCAFGE,则该二叉树结

点的前序序列为____,该二叉树对应的森林包括____棵树。

17.用一维数组存放的一棵完全二叉树如题图6-4所示。

则后序遍历该二叉树时结点访问的顺序为____。

18.由n个权值构成的哈夫曼树共有____个结点。

19.由带权为3,9,6,2,5的5个叶子结点构成一棵哈夫曼树,则带权路径长度为____。

20.设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,则

B中右指针域为空的结点有____个。

21.二叉树的存储结构分为____,树的存储结构分为____。

三、判断题

1.树中任意结点的子树不必是有序的。()

2.树可以看成特殊的无向图。()

3.可以使用双链表表示树型结构。()

4.顺序存储方式只能用于存储线性结构。()

5.完全二叉树的某结点若无左孩子,则必是叶结点。()

6.在叶子数目和权值相同的所有二叉树中,最优二叉树一定是完全二叉树。() 7.由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树。()

8.二叉树的前序遍历序列中,任意一个结点均处在其子树结点的前面。 () 9.二叉树的前序和后序遍历序列能惟一确定这棵二叉树。 ()

10.中序线索二叉树中,右线索若不为空,则一定指向其父结点。()

四、算法和操作题

1.假定一棵二叉树广义表表示为a(b(c),d(e,D),分别写出对它进行前序、

中序、后序遍历的结果。

前序:中序:后序:

2.已知一棵二叉树的中序和后序序列,求该二叉树的高度和双支、单支及叶子结点数。

中根序列:c,b,d,e,a,g,i,h,j,f

后根序列:c,e,d,b,i,j,h,g,fa

高度:双支:单支:叶子:

3.已知一棵树边的集合为{,M>,,N>,,I>,

,E>,,D>,,B>,,J>,,K>,,G>,,F>,,L>,,H>,,C>),请画出这棵树,并回答下列问题:

(1)哪个是根结点? (2)哪些是叶子结点?

(3)哪个是结点G的双亲? (4)哪些是结点G的祖先?

(5)哪些是结点G的孩子? (6)哪些是结点E的子孙?

(7)哪些是结点E的兄弟?哪些是结点F的兄弟?

(8)结点B和N的层次号分别是什么? (9)树的深度是多少?

(10)以结点C为根的子树的深度是多少?

4.将算术表达式((a+b)+c*(d+e)+f*(g+h)转化为二叉树。

5.一棵二叉树的结点数据采用顺序存储结构,存储于数组BT中,如题表6-1所示。画出该二叉树的链接表示形式。数组BT的存放形式是相对于满二叉树中编

号为数组下标值的结点值。若该结点不存在,则取0值。

6.假设前序遍历某棵树的结点次序为SACEFBDGHIJK;后序遍历该树的结点次

序为CFEABHGIKJDS,请画出这棵树。

7.已知一棵树如题图6-5所示,将其转换为其孩子兄弟表示的二叉树。并画

出该二叉树的后序线索二叉树。

8.试找出分别满足下列条件的所有二叉树:

(1)前序遍历序列和中序遍历序列相同。

(2)中序遍历序列和后序遍历序列相同。

(3)前序遍历序列和后序遍历序列相同。

9.已知信息为“ABCDBCDCBDBACB”,请按此信息构造哈夫曼树,求出每一字符的最优编码。

10.己知中序线索二叉树采用二叉链表存储结构,链结点的构造为:

其中若ltag为0,则lchild指向结点的前驱,否则lchild指向左孩子结点;

若rtag为0,则rchild指向结点的后继,否则rchild指向右孩子结点。下面

的算法返回x所指结点的直接后继结点的位置。若该算法有错,则请改正错误;若无错,请写“正确”二字。

BiTree INSUCC(BiTree x)

{s=X->rchild;

if(s->rtag)

while(s->ltag)

s=s->rchild;

returns; )

五、算法设计题

1.编写对二叉树进行中序遍历的非递归算法,并对算法执行题图6-6所示的二叉树的情况进行跟踪(即给出各阶段栈的变化及输出的结点序列)。栈已经定义:InitStack(S)(初始化)、Empty(S)(判栈空)、Push(S,p)(入栈)、Pop(S,p)(出栈)等操作。

2.假设在表示一棵二叉树的二叉链表上增加两个域:双亲域用于指示其双亲结点,标志域flag(可取0...2)的值,用以区分在遍历过程中到达该结点时继续向右或向左或访问该结点。试以此存储结构编写不用栈进行后序遍历的递归形式的算法。

3.一棵具有n个结点的完全二叉树,以一维数组作为存储结构,试设计一个对该完全二叉树进行前序遍历的算法。

4.设中序线索树的结点由5个域组成。

Info:给出结点的数据域。 LT:标志域,为0或1。

LL:当LT为1时,给出该结点的左孩子的地址。

当LT为0时,给出按中序遍历的前驱结点地址。

RT:标志域,为0或1。

RL:当 RT为1时,给出该结点的右孩子的地址。

当RT 为O时,给出按中序遍历的后继结点地址。

请编写程序,在具有上述结点结构的中序线索二叉树上,求某一结点p按后序遍历次序的后继结点的地址q,设该中序线索二叉树的根结点地址为r。

另外,请注意必须满足:

(l)额外空间的使用只能为O(1)。 (2)程序为非递归形式。

5.假设二叉树采用链接方法存储,编写一个函数按凹入表表示法打印出该二叉树。

6.给出中序线索树的结点结构,设计算法在不使用栈和递归的情况下前序遍历一棵中序线索树,并分析它的时间复杂度。

7.以二叉链表为存储结构,写出交换各结点左右子树的算法。

8.假设二叉树采用链接方法存储,编写一个函数按凹入表表示法打印出该二叉树。

一、选择题(参考答案)

1.B 2.B 3.C 4.A,C 5.C6.C 7.A 8.B 9.A,B

10.(1)C (2)A (3)C (4)A (5)C (6)A (7)C 11.B 12.A 13.B 14.A

15.B 16.D 17.A 18.C 19.D 20.D

二、填空题(参考答案)

1.树的总结点数-1。 2.前驱:1,后继,任意多个。

3. kl, k2, k4, k5, k7,2,k5, k6, kl,3,4。

4.3,4,6,1,1,2,A,F,G。

5.(1) k^(i-), (2) (3) n-l×k+n+1,(4)i≠nk+l(n=0,l,2...),n+1.

6.前序遍历,中序遍历。 7.前序,中序,后序,前序,后序。

8. 2i-1,「2/n, 2/n. 9.6个。

10. 160 11. 2n,n-l,n+l。 12.A

13.树可采用二叉树的存储结构并可利用二叉树的已有算法解决树的有关问题。

14.只有1个结点的树,空树。 15.I,F。

16.前序遍历序列为:EACBDGF,森林包括1棵树。 17. HIDJKEBLFGCA0 18. 2n-l。 19. 560 20.n+l。

21.顺序存储和链式存储,双亲链表表示法,孩子链表表示法,孩子兄弟链表表

示法

三、判断题

1. √

2. √

3. √

4.×

5. √

6.×

7.×

8. √

9.× 10.×

四、算法和操作题

1.假设一棵二叉树广义表表示为a(b(c),d(e,D),分别写出对它进行前序、

中序、后序遍历的结果。

【解答】前序:a,b,c,d,e,D

中序:c,b,a,e,d,D 后序:c,b,e,D,d,a

2.已知一棵二叉树的中序和后序序列,求该二叉树的高度和双支、单支及叶子

结点数。

【解答】中序序列:c,b,d,e,a,g,i,h,j,f

后序序列:c,e,d,b,i,j,h,g,f,a

由中序和后序(前序)遍历序列可惟一确定一棵二叉树,基本思想是后序

(前序)定根,中序分左右。由后序序列可知该树的根结点为a,由中序遍历

序列可知该树的左子树为{c,b,d,e},右子树为{g,i,h,j,f);再由后序

序列可知该树的左子树的根结点为b,右子树的根结点为f.再由中序遍历序列

可知b结点的左子树为{c},右子树为{d,e);再由后序遍历序列可知右子树{d,

e}的根结点为d,再由中序遍历序列可知d的左子树为空,右子树为{e}。对以

f为根结点的子树可做类似的分析。最后得到由中序和后序序列决定的二叉树

为:

a(b(c,d(,e)),f(g(,h(i,j)))),由此可知该树:

高度:5 双分支:3 单分支:3 叶结点:4。

3.已知一棵树边的集合为{

B>,},请画出这棵

树,并回答问题?

【解答】根据边集画出的树如下所示:

(1)根结点是:A。

(2)叶子结点是:D,M,N,F,J,K,L。 (3)结点G的双亲是:C。

(4)结点G的祖先是:A,C。 (5)结点G的孩子是:J,K。

(6)结点E的子孙是:I,M,N。

(7)结点E的兄弟是:D;结点F的兄弟是:G,H。

(8)结点B和N的层次号分别是:2,5。 (9)树的深度是:5。

(10)以结点C为根的子树的深度是:3。

4.将算术表达式((a+b)+c*(d+e)+f*(g+h)转化为二叉树。

【解答】转化成如下二叉树:

5.-棵二叉树的结点数据采用顺序存储结构,存储于数组BT中,如题表6-1所示。画出该二叉树的链接表示形式。数组BT的存放形式是相对于满二叉树中编号为数组下标值的结点值。若该结点不存在,则取0值。

题表6-1

【解答】二叉树的链式表示为:

6.若前序遍历某树的结点次序:SACEFBDGHIJK;后序遍历的结点次序为:CFEABHGIKJDS,画出这棵树。

【解答】画出树如下:

7.将原教材题图6-5转换为孩子兄弟所表示的二叉树及该二叉树的后序线索二叉树如下:

^

8.空树满足所有条件。非空树如下:

(1)前序和中序遍历序列相同的二叉树是没有左子树的二叉树(右单支树)。

(2)中序和后序遍历序列相同的二叉树是没有右子树的二叉树(左单支树)。

(3)前序和后序遍历序列相同的二叉树是只有根的二叉树。

9.在信息“ABCD BCD CB DB ACB”中A,B,C,D四个字符出现的频率依次是:2,5,4,3。在哈夫曼树中每个字符的最优编码:

可得编码为:

A-110 B-O C-10 D-II1

信息编码为:110010111 0101111001110 110100

10.错误。修改如下:

BiTree INSUCC (BiTree x)

{S=X->rchild;

if(s->rtag)

while (s->ltag)

s=s->lchild;

return S; }

五、算法设计题

1.编写对二叉树进行中序遍历的非递归算法,并对算法执行原教材题图6-6所示的二叉树的情况进行跟踪(即给出各阶段栈的变化及输出的结点序列)。

【解答】中序遍历的非递归算法如下:

对于给定的二叉树,算法执行情况如下:A入栈,B入栈,D入栈,D出栈,访问D,B出栈,访问B,A出栈,访问A,,C入栈,E入栈,E出栈,访问E,G入栈,G出栈,访问 G,C出栈,访问C,F入栈,F出栈,访问F,栈和指针

p均空,结束。最后的遍历序列是:DBAGECF。

2.假设在表示一棵二叉树的二叉链表上增加两个域:双亲域用于指示其双亲结点,标志域flag(可取0,…,2)的值,用以区分在遍历过程中到达该结点时

继续向右或向左或访问该结点。试以此存储结构编写不用栈进行后序遍历的递

推形式的算法。

【解答】要解决这一问题必须区分结点在访问过程中的状态,这可通过结点的

标志域来处理。对一个结点来说当前的结点可能由:(1)其双亲结点转换;(2)其左子树遍历结束转换;(3)其右予树遍历结束转换。所以,算法主要执行按这三

种状态进行处理或处理当前结点或转换结点的状态,从而算法可描述为:

3.一棵具有n个结点的完全二叉树,以一维数组作为存储结构,试设计一个对该完全二叉树进行前序遍历的算法。

【解答】设完全二叉树的结点以层次为序,按从上至下,由左至右的顺序编号,存放在一维数组R[1,…,n]中。对于编号为t的结点,若存在子结点,其左

孩子结点一定是2*t,右孩子结点是2*t+l,由此可得对完全二叉树进行前序遍历的递归算法。

4.在不使用栈和递归的条件下,后序序列遍历中序线索二叉树,需要知道任意结点的后序直接后继。中序线索树所能提供的是当前访问结点的祖先(双亲)

信息,利用双亲信息,就可以对中序线索树进行后序遍历。中序线索树有如下

性质:

● 若x是parent的左孩子,则parent是x的最右子孙的右线索。

● 若x是parent的右孩子,则parent是x的最左子孙的左线索。

因此设计两个函数求给定结点的最左子孙的左线索和最右子孙的右线索;这两个线索均是T的祖先。具体实现如下:

5.凹入表示法打印二叉树:

采用前序遍历的递归函数依次输出各结点的值,子结点比父结点右缩进3个字符宽度,具体实现算法如下:

6.前序遍历一棵中序线索树:

在不使用栈和递归的情况下对线索二叉树进行前序遍历,需要知道任意结点前序的直接后继。

7.以二叉链表为存储结构,写出交换各结点左右子树的算法。

【解答】要交换各结点的左右子树,最方便的办法是用后序遍历算法,每访问一个结点时把两棵子树的指针进行交换,最后一次访问是交换根结点的子树。算法如下:

二叉树的存储表示

二叉树的存储表示 1二叉树的顺序存储表示 2二叉树的链式存储表示 3三叉链表 1二叉树的顺序存储表示 二叉树的顺序存储结构的定义如下: #define MAXSIZE = 100; //暂定二叉树中节点数的最大值为100 Typedef struct { ElemType *data ; //存储空间基址(初始化时分配空间) Int nodeNum ; //二叉树中节点数 }SqBiTree ; //二叉树的顺序存储结构 为了能在存储结构中反映出节点之间的逻辑关系,必须将二叉树中节点依照一定规律安排在这组存储单元中。对于完全二叉树,只要从根起按层序存储即可。 显然,这种顺序存储结构仅适用于完全二叉树。因为,在最坏的情况下,一个深度为 k 且只有 k 个结点的单支树(树中不存在度为 2 的结点)却需要长度为2k -1的一维数组。 二叉树的顺序存储图如图1所示: 2 6 320 116 5402 106 543216 (a )满二叉树(b )一般二叉树 图1 顺序存储

2二叉树的链式存储表示 二叉树有不同的链式结构,其中最常用的是二叉链表与三叉链表。二叉链表的结点形式如表1所示: 表1链式存储 date域:称为数据域,用于存储二叉树结点中的数据元素, 1child域:称为左孩子指针域,用于存放指向本结点左孩子的指针(左指针)。 rchild域:称为右孩子指针域,用于存放指向本结点右孩子的指针(右指针)二叉链表中的所有存储结点通过它们的左、右指针的链接而形成一个整体。 根指针:每个二叉链表还必须有一个指向根结点的指针。根指针具有标识二叉链表的作用,对二叉链表的访问能从根指针开始。 图2中(a)(b)表示一棵二叉树及其二叉链表。值得注意的是,二叉链表中每个存储结点的每个指针域必须有一个值,这个值或者是指向该结点的一个孩子的指针,或者是空指针NULL。 二叉链表的类型定义如下: Typedef struct btnode *bitreptr; Struct btnode { Datatype data; Bitreptr lchild,rchild; }; Bitreptr root; 若二叉树为空,则root=NULL。若某结点的某个孩子不存在,则相应的指针为空。具有n个结点的二叉树中,一共有2n个指针域,其中只有n-1个用来指向结点的的左右孩子,其余的n+1个指针域为NULL。 在二叉链表这种存储结构上,二叉树的多数基本运算如求根,求左、右孩子等很容易实现。但求双亲运算PARENT(BT,X)的实现却比较麻烦,而且其时间性能不高。

数据结构树和二叉树实验报告

《数据结构》课程实验报告 实验名称树和二叉树实验序号 5 实验日期 姓名院系班级学号 专业指导教师成绩 教师评语 一、实验目的和要求 (1)掌握树的相关概念,包括树、结点的度、树的度、分支结点、叶子结点、儿子结点、双亲结点、树 的深度、森林等定义。 (2)掌握树的表示,包括树形表示法、文氏图表示法、凹入表示法和括号表示法等。 (3)掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。 (4)掌握二叉树的性质。 (5)重点掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。 (6)重点掌握二叉树的基本运算和各种遍历算法的实现。 (7)掌握线索二叉树的概念和相关算法的实现。 (8)掌握哈夫曼树的定义、哈夫曼树的构造过程和哈夫曼编码产生方法。 (9)掌握并查集的相关概念和算法。 (10)灵活掌握运用二叉树这种数据结构解决一些综合应用问题。 二、实验项目摘要 1.编写一程序,实现二叉树的各种基本运算,并在此基础上设计一个主程序完成如下功能: (1)输出二叉树b; (2)输出H结点的左、右孩子结点值; (3)输出二叉树b的深度; (4)输出二叉树b的宽度; (5)输出二叉树b的结点个数; (6)输出二叉树b的叶子结点个数。 2.编写一程序,实现二叉树的先序遍历、中序遍历和后序遍历的各种递归和非递归算法,以及层次遍历的算法。 三、实验预习内容 二叉树存储结构,二叉树基本运算(创建二叉树、寻找结点、找孩子结点、求高度、输出二叉树)

三、实验结果与分析 7-1 #include #include #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; struct node *lchild; struct node *rchild; } BTNode; void CreateBTNode(BTNode *&b,char *str) { BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while (ch!='\0') { switch(ch) { case '(':top++;St[top]=p;k=1; break; case ')':top--;break; case ',':k=2; break; default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch;p->lchild=p->rchild=NULL; if (b==NULL) b=p; else { switch(k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; }

二叉排序树的建立及遍历的实现

课程设计任务书 题目: 二叉排序树的建立及遍历的实现 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能: (1)建立二叉排序树; (2)中序遍历二叉排序树并输出排序结果; 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等; (4)结束语; (5)参考文献。 时间安排:2007年7月2日-7日(第18周) 7月2日查阅资料 7月3日系统设计,数据结构设计,算法设计 7月4日-5日编程并上机调试7月6日撰写报告 7月7日验收程序,提交设计报告书。 指导教师签名: 2007年7月2日 系主任(或责任教师)签名: 2007年7月2日 排序二叉树的建立及其遍历的实现

摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据 组合成排序二叉树,并进行,先序,中序和后序遍历。设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。 关键字:排序二叉树,先序遍历,中序遍历,后序遍历 0.引言 我所设计的题目为排序二叉树的建立及其遍历的实现。排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。 该设计根据输入的数据进行建立排序二叉树。对排序二叉树的遍历,其关键是运用递归 调用,这将极大的方便算法设计。 1.需求分析 建立排序二叉树,主要是需要建立节点用来存储输入的数据,需要建立函数用来创造排序二叉树,在函数内,需要进行数据比较决定数据放在左子树还是右子树。在遍历二叉树中,需要建立递归函数进行遍历。 该题目包含两方面的内容,一为排序二叉树的建立;二为排序二叉树的遍历,包括先序遍历,中序遍历和后序遍历。排序二叉树的建立主要运用了循环语句和递归语句进行,对遍历算法运用了递归语句来进行。 2.数据结构设计 本题目主要会用到建立结点,构造指针变量,插入结点函数和建立排序二叉树函数,求深度函数,以及先序遍历函数,中序遍历函数和后序遍历函数,还有一些常用的输入输出语句。对建立的函明确其作用,先理清函数内部的程序以及算法在将其应用到整个程序中,在建立排序二叉树时,主要用到建立节点函数,建立树函数,深度函数,在遍历树是,用到先序遍历函数,中序遍历函数和后序遍历函数。

数据结构二叉树实验报告

实验三二叉树的遍历 一、实验目的 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); }

数据结构实验指导书 二叉树两种存储结构的应用

一、实验名称:二叉树两种存储结构的应用 二、实验目的和要求: 1.掌握二叉树的遍历思想及二叉树的存储实现。 2.掌握二叉树的基本操作:建立二叉树、二叉树的遍历 3.选择一种形式完成二叉树的显示 4.掌握二叉树的常见算法的程序实现 5.实验报告中要写出测试数据、错误分析以及收获 三、上机实验内容一:二叉树的建立及相关算法的实现 1.完成的功能包括如下几点: ①编程实现建立一棵二叉树,然后对其进行先序、中序和后序遍历。 分析:将要输入的二叉树按照其对应的完全二叉树的顺序输入,若当前位置不存在结点则输入@ ②显示二叉树 ③求二叉树的高度及二叉树的叶子个数等等 ④在主函数中设计一个简单的菜单,分别调试上述算法 四、上机实验内容二:哈夫曼编码/译码系统 1.要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。 2.设计分析 在本例中的算法主要有:哈夫曼树的建立;哈夫曼编码的生成;对编码信息的翻译。要求设置发送者和接收者两个功能。 发送者的功能包括: ①输入待传送的字符信息;②统计字符信息中出现的字符类数和各字符出现的次数(频率);③根据字符的种类数和各字符出现的次数建立哈夫曼树;④利用以上哈夫曼树求出各字符的哈夫曼编码;⑤将字符信息转换成对应的编码信息进行传送。 接收者的功能包括: ①接收发送者传送来的编码信息;②利用上述哈夫曼树对编码进行翻译,即将编码信息还原成发送前的字符信息。 3.结点的类型定义 ①哈夫曼树的存储结构类型定义为:

typedef struct { char data; /*编码对应的字符*/ int weight; /*结点的权值*/ int lchild,rchild,parent;/*左右孩子及双亲的下标*/ }HTNode; ②哈夫曼编码的存储结构类型定义为: typedef struct { char bits[N]; /*存放哈夫曼编码的字符数组*/ int start; /*记录编码的起始位置,因为每种字符的编码长度不同*/ }HCode; 说明:只占用2个课内学时,学生可利用开放实验室利用课余时间完成本次实验内容。

第六章树和二叉树习题数据结构

习题六树和二叉树 一、单项选择题 1.以下说法错误的是 ( ) A.树形结构的特点是一个结点可以有多个直接前趋 B.线性结构中的一个结点至多只有一个直接后继 C.树形结构可以表达(组织)更复杂的数据 D.树(及一切树形结构)是一种"分支层次"结构 E.任何只含一个结点的集合是一棵树 2.下列说法中正确的是 ( ) A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的度肯定等于2 D.任何一棵二叉树中的度可以小于2 3.讨论树、森林和二叉树的关系,目的是为了() A.借助二叉树上的运算方法去实现对树的一些运算 B.将树、森林按二叉树的存储方式进行存储 C.将树、森林转换成二叉树 D.体现一种技巧,没有什么实际意义 4.树最适合用来表示 ( ) A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定 6.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B.M1+M2 C.M3 D.M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A. 250 B. 500 C.254 D.505 E.以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( ) A.不确定 B.2n C.2n+1 D.2n-1 9.二叉树的第I层上最多含有结点数为() A.2I B. 2I-1-1 C. 2I-1 D.2I -1 10.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( )结点A.2h B.2h-1 C.2h+1 D.h+1 11. 利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子 B.指向最右孩子 C.空 D.非空 14.在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序()A.都不相同 B.完全相同 C.先序和中序相同,而与后序不同 D.中序和后序相同,而与先序不同 15.在完全二叉树中,若一个结点是叶结点,则它没()。 A.左子结点 B.右子结点 C.左子结点和右子结点 D.左子结点,右子结点和兄弟结点 16.在下列情况中,可称为二叉树的是()

二叉树的顺序存储结构

#include #include #define VirNode ' ' /* 用空格符描述“虚结点”*/ #define MAXSIZE 64 typedef char ElemType; typedefElemTypeSqBitTree[MAXSIZE]; void crebitree(SqBitTreeBT,int n) /* n为二叉树真实结点数*/ { inti,j,m; i=1; m=0; while(m

{ inti,n=0; for(i=1;i<=BT[0]/2;i++) if(BT[i]!=VirNode&&BT[2*i]==VirNode&&BT[2*i+1]==VirNode) n++; for(;i<=BT[0];i++) if(BT[i]!=VirNode) n++; return n; } int countn1(SqBitTree BT) { inti,n=0; for(i=1;i<=BT[0]/2;i++) if(BT[i]!=VirNode&&(BT[2*i]==VirNode&&BT[2*i+1]!=VirNode|| BT[2*i]!=VirNode&&BT[2*i+1]==VirNode)) n++; return n; } int countn2(SqBitTree BT) { inti,n=0; for(i=1;i<=BT[0]/2;i++) if(BT[i]!=VirNode&&BT[2*i]!=VirNode&&BT[2*i+1]!=VirNode) n++; return n; } //主函数 void main() { SqBitTree T; int n; crebitree(T,5); levellist(T); printf("High=%d\n",high(T)); levellist(T); printf("n2=%d\n",countn2(T)); getch(); }

目前最完整的数据结构1800题包括完整答案树和二叉树答案

第6章树和二叉树 部分答案解释如下。 12. 由二叉树结点的公式:n=n0+n1+n2=n0+n1+(n0-1)=2n0+n1-1,因为n=1001,所以1002=2n0+n1,在完全二叉树树中,n1只能取0或1,在本题中只能取0,故n=501,因此选E。 42.前序序列是“根左右”,后序序列是“左右根”,若要这两个序列相反,只有单支树,所以本题的A和B均对,单支树的特点是只有一个叶子结点,故C是最合适的,选C。A或B 都不全。由本题可解答44题。 47. 左子树为空的二叉树的根结点的左线索为空(无前驱),先序序列的最后结点的右线索为空(无后继),共2个空链域。 52.线索二叉树是利用二叉树的空链域加上线索,n个结点的二叉树有n+1个空链域。 部分答案解释如下。 6.只有在确定何序(前序、中序、后序或层次)遍历后,遍历结果才唯一。 19.任何结点至多只有左子树的二叉树的遍历就不需要栈。 24. 只对完全二叉树适用,编号为i的结点的左儿子的编号为2i(2i<=n),右儿子是2i+1(2i+1<=n) 37. 其中序前驱是其左子树上按中序遍历的最右边的结点(叶子或无右子女),该结点无右孩子。 38 . 新插入的结点都是叶子结点。 42. 在二叉树上,对有左右子女的结点,其中序前驱是其左子树上按中序遍历的最右边的结点(该结点的后继指针指向祖先),中序后继是其右子树上按中序遍历的最左边的结点(该结点的前驱指针指向祖先)。 44.非空二叉树中序遍历第一个结点无前驱,最后一个结点无后继,这两个结点的前驱线索和后继线索为空指针。 三.填空题

1.(1)根结点(2)左子树(3)右子树 2.(1)双亲链表表示法(2)孩子链表表示法(3)孩 子兄弟表示法 3.p->lchild==null && p->rchlid==null 4.(1) ++a*b3*4-cd (2)18 5.平衡 因子 6. 9 7. 12 8.(1)2k-1 (2)2k-1 9.(1)2H-1 (2)2H-1 (3)H=?log2N?+1 10. 用顺序存储二叉树时,要按完全二叉树的形式存储,非完全二叉树存储时,要加“虚结 点”。设编号为i和j的结点在顺序存储中的下标为s 和t ,则结点i和j在同一层上的条 件是?log2s?=?log2t?。 11. ?log2i?=?log2j?12.(1)0 (2)(n-1)/2 (3)(n+1)/2 (4) ?log2n?+1 13.n 14. N2+1 15.(1) 2K+1-1 (2) k+1 16. ?N/2? 17. 2k-2 18. 64 19. 99 20. 11 21.(1) n1-1 (2)n2+n3 22.(1)2k-2+1(第k层1个结点,总结点个数是2H-1,其双亲是2H-1/2=2k-2)(2) ?log2i?+1 23.69 24. 4 25.3h-1 26. ?n/2? 27. ?log2k?+1 28.(1)完全二叉树 (2)单枝树,树中任一结点(除最后一个结点是叶子外),只有左子女或 只有右子女。 29.N+1 30.(1) 128(第七层满,加第八层1个) (2) 7 31. 0至多个。任意二叉树,度为1的结点个数没限制。只有完全二叉树,度为1的结点个 数才至多为1。 32.21 33.(1)2 (2) n-1 (3) 1 (4) n (5) 1 (6) n-1 34.(1) FEGHDCB (2)BEF(该二叉树转换成森林,含三棵树,其第一棵树的先根次序是 BEF) 35.(1)先序(2)中序 36. (1)EACBDGF (2)2 37.任何结点至多只有右子女 的二叉树。 38.(1)a (2) dbe (3) hfcg 39.(1) . (2) ...GD.B...HE..FCA 40.DGEBFCA 41.(1)5 (2)略 42.二叉排序树 43.二叉树 44. 前序 45.(1)先根次序(2)中根次序46.双亲的右子树中最左下的叶子结点47.2 48.(n+1)/2 49.31(x的后继是经x的双亲y的右子树中最左下的叶结点) 50.(1)前驱 (2)后 继 51.(1)1 (2)y^.lchild (3)0 (4)x (5)1 (6) y (7)x(编者注:本题按 中序线索化) 52.带权路径长度最小的二叉树,又称最优二叉树 53.69 54.(1)6 (2)261 55.(1)80 (2)001(不唯一)56.2n0-1 57.本题①是表达式求值,②是在二叉排序树中删除值为x的结点。首先查找x,若没有x, 则结束。否则分成四种情况讨论:x结点有左右子树;只有左子树;只有右子树和本身是叶 子。 (1)Postoder_eval(t^.Lchild) (2) Postorder_eval(t^.Rchild) (3)ERROR(无此运 算符)(4)A (5)tempA^.Lchild (6)tempA=NULL(7)q^.Rchild (8)q (9)tempA^.Rchild (10)tempA^.Item

二叉树的建立及其遍历实验报告

数据结构实验报告 ———二叉树的建立及其遍历 一、实验目的 1、了解二叉树的建立的方法及其遍历的顺序,熟悉二叉树的三种遍历 2、检验输入的数据是否可以构成一颗二叉树 二、实验的描述和算法 1、实验描述 二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。因为耳熟的每一个左右子树又是一颗二叉树,所以可以用递归的方法来建立其左右子树。二叉树的遍历是一种把二叉树的每一个节点访问完并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句实现。 2、算法 #include #include #define OVERFLOW 0 #define OK 1 #define ERROR 0 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree CreateBiTree(BiTree T)

{ scanf("%c",&e); if(e==' ') T=NULL; else { if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=e; T->lchild=CreateBiTree(T->lchild); T->rchild=CreateBiTree(T->rchild); } return T; } /************************前序遍历***********************/ char PreOrderTraverse(BiTree T,char (* Visit)(char e)) { if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK; } char Visit(char e) { printf("%5c",e); return OK; } main() {

数据结构实验报告-二叉树的实现与遍历

《数据结构》第六次实验报告 学生姓名 学生班级 学生学号 指导老师

一、实验内容 1) 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序 以及按层次遍历的操作,求所有叶子及结点总数的操作。 2) 输出树的深度,最大元,最小元。 二、需求分析 遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。 递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。 下面重点来讲述非递归方法: 首先介绍先序遍历: 先序遍历的顺序是根左右,也就是说先访问根结点然后访问其左子再然后访问其右子。具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。 再次介绍中序遍历: 中序遍历的顺序是左根右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。如此循环直至结点指针和栈均为空,遍历结束。 最后介绍后序遍历: 后序遍历的顺序是左右根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。 三、详细设计 源代码:

实验五--二叉树的存储结构和基本操作

实验五二叉树的存储表示和基本操作 实验内容 1. 二叉树的二叉链表的存储结构 —————二叉树的二叉链表存储表示———————— typedef struct node { ElemType data; /*数据元素*/ struct node *lchild; /*指向左孩子*/ struct node *rchild; /*指向右孩子*/ } BTNode; 2. 二叉树的基本操作 (1)创建操作:创建一棵二叉树。 (2)查找操作:查找二叉树中值为x的结点。 (3)查找左孩子操作:查找二叉树中值为x的结点的左孩子。 (4)查找右孩子操作:查找二叉树中值为x的结点的右孩子。 (5)求深度操作:求二叉树的深度。 (6)求宽度操作:求二叉树的宽度。 (7)求结点个数操作:求二叉树的结点个数。 (8)求叶子结点个数操作:求二叉树的叶子结点个数。 (9)输出操作:以括号表示法输出二叉树。 3. 链式队列操作实现的步骤 (1)实现将链式队列的存储结构和基本操作程序代码。 (2)实现main主函数。 4.程序代码完整清单 #include #include #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; /*数据元素*/ struct node *lchild; /*指向左孩子*/ struct node *rchild; /*指向右孩子*/ } BTNode; //基本操作函数声明 void CreateBTNode(BTNode *&b,char *str); /*创建一棵二叉树*/ BTNode *FindNode(BTNode *b,ElemType x); /*查找二叉树的结点*/ BTNode *LchildNode(BTNode *p); /*查找二叉树结点的左孩子*/ BTNode *RchildNode(BTNode *p); /*查找二叉树结点的右孩子*/ int BTNodeDepth(BTNode *b); /*求二叉树的深度*/

数据结构树和二叉树习题

树与二叉树 一.选择题 1.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结 点数为()个。 A.15B.16C.17D.47 2.按照二叉树的定义,具有3个结点的不同形状的二叉树有()种。 A. 3 B. 4 C. 5 D. 6 3.按照二叉树的定义,具有3个不同数据结点的不同的二叉树有()种。 A. 5 B. 6 C. 30 D. 32 4.深度为5的二叉树至多有()个结点。1 A. 16 B. 32 C. 31 D. 10 5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的 结点数至少为()。 A. 2h B. 2h-1 C. 2h+1 D. h+1 6.对一个满二叉树2,m个树叶,n个结点,深度为h,则()。 A. n=h+m3 B. h+m=2n C. m=h-1 D. n=2 h-1 1深度为n的二叉树结点至多有2n-1 2满二叉树是除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树7.任何一棵二叉树的叶结点在先序.中序和后序遍历序列中的相对次序()。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 8.如果某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉 树的后序为()。 A. uwvts B. vwuts C. wuvts D. wutsv 9.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是()。 A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca 10.在一非空二叉树的中序遍历序列中,根结点的右边()。 A. 只有右子树上的所有结点 B. 只有右子树上的部分结点 C. 只有左子树上的部分结点 D. 只有左子树上的所有结点 11.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为 先序遍历.中序遍历和后序遍历。这里,我们把由树转化得到的二叉树4叫做这棵数对应的二叉树。结论()是正确的。 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同 B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同 3对于深度为h的满二叉树,n=20+21+…+2h-1=2h-1,m=2h-1。故而n=h+m。 4树转化为二叉树的基本方法是把所有兄弟结点都用线连起来,然后去掉双亲到子女的连线,只留下双亲到第一个子女的连线。因此原来的兄弟关系就变为双亲与右孩子的关系。 1/ 9

二叉树的建立及几种简单的遍历方法

#include "stdio.h" #include "stdlib.h" #define STACK_INIT_SIZE 100 //栈存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 //------二叉树的存储结构表示------// typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //-----顺序栈的存储结构表示------// typedef struct{ BiTree *top; BiTree *base; int stacksize; }SqStack; //*************************************************** //构造一个空栈s SqStack *InitStack(); //创建一颗二叉树 BiTree CreatBiTree(); //判断栈空 int StackEmpty(SqStack *S); //插入元素e为新的栈顶元素 void Push(SqStack *S,BiTree p); //若栈不为空,则删除s栈顶的元素e,将e插入到链表L中void Pop(SqStack *S,BiTree *q); //非递归先序遍历二叉树 void PreOrderTraverse(BiTree L); //非递归中序遍历二叉树 void InOrderTraverse(BiTree L); //非递归后序遍历二叉树 void PostOrderTraverse(BiTree L); //递归后序遍历二叉树 void PostOrder(BiTree bt); //递归中序遍历二叉树 void InOrder(BiTree bt); //递归先序遍历二叉树 void PreOrder(BiTree bt); //***************************************************

数据结构实验-二叉树的操作

******************************* 实验题目:二叉树的操作 实验者信息:班级13007102,姓名庞文正,学号1300710226 实验完成的时间3:00 ****************************** 一、实验目的 1,掌握二叉树链表的结构和二叉树的建立过程。 2,掌握队列的先进先出的运算原则在解决实际问题中的应用。 3,进一步掌握指针变量、指针数组、动态变量的含义。 4,掌握递归程序设计的特点和编程方法。 二、实验内容 已知以二叉链表作存储结构,试编写按层次遍历二叉树的算法。(所谓层次遍历,是指从二叉树的根结点开始从上到下逐层遍历二叉树,在同一层次中从左到右依次访问各个节点。)调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对算法的理解。 三、算法设计与编码 1.本实验用到的理论知识 总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,最好能加上自己的解释。 本算法要采用一个循环队列que,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉的目的。2.算法概要设计 给出实验的数据结构描述,程序模块、功能及调用关系 #include #include #define M 100 typedef struct node //二叉链表节点结构 {int data; //数据域 struct node *lchild,*rchild; //左孩子右孩子链 }bitree; bitree *que[M]; //定义一个指针数组,说明队列中的元素bitree 指针类型 int front=0, rear=0; //初始化循环列队 bitree *creat() //建立二叉树的递归算法 {bitree *t; int x; scanf("%d",&x); if(x==0) t=NULL; //以x=0 表示输入结束 else {t=malloc(sizeof(bitree)); //动态生成节点t,分别给节点t 的数据域,t->data=x; //左右孩子域赋值,给左右孩子赋值时用到 t->lchild=creat(); // 了递归思想 t->rchild=creat(); }

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告 篇一:二叉树的建立及遍历实验报告 实验三:二叉树的建立及遍历 【实验目的】 (1)掌握利用先序序列建立二叉树的二叉链表的过程。 (2)掌握二叉树的先序、中序和后序遍历算法。 【实验内容】 1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。 如:输入先序序列abc###de###,则建立如下图所示的二叉树。 并显示其先序序列为:abcde 中序序列为:cbaed 后序序列为:cbeda 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码 5.编译->链接->调试 #include #include #define OK 1 #define OVERFLOW -2 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; Status CreateBiTree(BiTree &T) { TElemType ch; scanf("%c",&ch); if (ch=='#') T= NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))

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

学生实验报告 学院:软通学院 课程名称:数据结构与算法 专业班级:软件142 班 姓名:邹洁蒙 学号: 0143990

学生实验报告 (二) 一、实验综述 1、实验目的及要求 目的:1)掌握树与二叉树的基本概念; 2)掌握二叉树的顺序存储,二叉链表的先序遍历中序遍历和后序遍历算法; 3)掌握树的双亲表示法。 要求:1)编程:二叉树的顺序存储实现; 2)编程:二叉链表的先序遍历中序遍历和后序遍历实现; 3)编程:树的双亲表示法实现。 2、实验仪器、设备或软件 设备:PC 软件:VC6 二、实验过程(编程,调试,运行;请写上源码,要求要有注释) 1.编程:二叉树的顺序存储实现 代码: BiTree::BiTree()//建立存储空间 { data = new int[MAXSIZE]; count = 0; } void BiTree::AddNode(int e)//加结点 { int temp = 0; data[count] = e; count++;//从编号0开始保存 }

运行截图: 2.编程:二叉链表的先序遍历中序遍历和后序遍历实现代码: void InOrderTraverse(BiTree* Head)//中序遍历 { if (Head) { InOrderTraverse(Head->LeftChild); cout << Head->data<<" "; InOrderTraverse(Head->RightChild); } } void PreOrderTraverse(BiTree* Head)//先序遍历 { if (Head) { cout << Head->data << " "; PreOrderTraverse(Head->LeftChild); PreOrderTraverse(Head->RightChild); } } void PostOrderTraverse(BiTree* Head)//后序遍历 { if (Head) { PostOrderTraverse(Head->LeftChild); PostOrderTraverse(Head->RightChild); cout << Head->data << " "; } } 运行截图:

二叉树的存储与实现

实验课程名称数据结构与算法 实验项目名称二叉树的存储与实现 年级 08 级 专业数学类 学生姓名 学号 理学院 实验时间:年月日

学生实验室守则 一、按教学安排准时到实验室上实验课,不得迟到、早退和旷课。 二、进入实验室必须遵守实验室的各项规章制度,保持室内安静、整洁,不准在室内打闹、喧哗、吸烟、吃食物、随地吐痰、乱扔杂物,不准做与实验内容无关的事,非实验用品一律不准带进实验室。 三、实验前必须做好预习(或按要求写好预习报告),未做预习者不准参加实验。 四、实验必须服从教师的安排和指导,认真按规程操作,未经教师允许不得擅自动用仪器设备,特别是与本实验无关的仪器设备和设施,如擅自动用或违反操作规程造成损坏,应按规定赔偿,严重者给予纪律处分。 五、实验中要节约水、电、气及其它消耗材料。 六、细心观察、如实记录实验现象和结果,不得抄袭或随意更改原始记录和数据,不得擅离操作岗位和干扰他人实验。 七、使用易燃、易爆、腐蚀性、有毒有害物品或接触带电设备进行实验,应特别注意规范操作,注意防护;若发生意外,要保持冷静,并及时向指导教师和管理人员报告,不得自行处理。仪器设备发生故障和损坏,应立即停止实验,并主动向指导教师报告,不得自行拆卸查看和拼装。 八、实验完毕,应清理好实验仪器设备并放回原位,清扫好实验现场,经指导教师检查认可并将实验记录交指导教师检查签字后方可离去。 九、无故不参加实验者,应写出检查,提出申请并缴纳相应的实验费及材料消耗费,经批准后,方可补做。 十、自选实验,应事先预约,拟订出实验方案,经实验室主任同意后,在指导教师或实验技术人员的指导下进行。 十一、实验室内一切物品未经允许严禁带出室外,确需带出,必须经过批准并办理手续。 学生所在学院:理学院专业:数学类班级:08级

相关文档
最新文档