树型结构习题

树型结构习题
树型结构习题

第6章 树

【例6-1】写出如图6-1所示的树的叶子结点、非终端结点、每个结点的度及树深度。 解:

(1)叶子结点有:B 、D 、F 、G 、H 、I 、J 。 (2)非终端结点有:A 、C 、E 。 (3)每个结点的度分别是:A 的度为4,C

的度为2,E 的度为3,其余结点的度为0。 (4)树的深度为3。

【例6-2】一棵度为2的树与一棵二叉树有什么区别?

解:度为2的树有两个分支,但分支没有左右之分;一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能交换。 【例6-3】树与二叉树有什么区别?

解:区别有两点:

(1)二叉树的一个结点至多有两个子树,树则不然;

(2)二叉树的一个结点的子树有左右之分,而树的子树没有次序。

【例6-4】分别画出具有3个结点的树和三个结点的二叉树的所有不同形态。

解:如图6-2(a)所示,具有3个结点的树有两种不同形态。

如图6-2(B )所示,具有3个结点的二叉树有以下五种不同形态。

【例6-8】如图6-3所示的二叉树,试分别写出它的顺序表示和链接表示(二叉链表)。

图6-2(a)

图6-2(b)

A B C D E

F G H I J 图6-1

a b c

d

e

f

g

图6-3

解:

(2)该二叉树的二叉链表表示如图6-4所示。

【例6-9】试找出满足下列条件的所有二叉树:

(1)先序序列和中序序列相同; (2)中序序列和后序序列相同; (3)先序序列和后序序列相同。 解:

(1)先序序列和中序序列相同的二叉树为:空树或者任一结点均无左孩子的非空二叉树; (2)中序序列和后序序列相同的二叉树为:空树或者任一结点均无右孩子的非空二叉树; (3)先序序列和后序序列相同的二叉树为:空树或仅有一个结点的二叉树。

【例6-10】如图6-5所示的二叉树,要求:

(1)写出按先序、中序、后序遍历得到的结点序列。

(2)画出该二叉树的后序线索二叉树。 解: (1) 先序遍历序列:ABDEFC 中序遍历序列:DEFBAC 后序遍历序列:FEDBCA (2)其后序线索二叉树如图6-6所示。

b

a

c d

e f

图6-5

图6-6

图6-4

【例6-11】将图6-7所示的树转换为二叉树。

解:第一步,加线。第二步,抹线。第三步,旋转。过程如图6-8所示。

【例6-12】将如图6-9所示的二叉树转换为树。

A 图6-7

B

C

D

E

F

G

H

I K L M

J A B C

D

E

F

H I

J 图6-9

A

图6-8(a) 第一步 加线

B C D E F G H I K L M

J A 图6-8(b) 第二步 抹线 B C D

E F G H I K L M

J

A B

图6-8(c) 第三步 旋转

C F D

K

G E

L

H M

I

J

解: 第一步,加线。第二步,抹线。第三步,调整。过程如图6-10所示。

【例6-13】将如图6-11所示的森林转换成二叉树。

解: 步骤略,结果如图6-12所示。

【例6-14】假定用于通信的电文由8个字符A 、B 、C 、D 、E 、F 、G 、H 组成,各字母在电文中出现的概率为5%、25%、4%、7%、9%、12%、30%、8%,试为这8个字母设计哈夫曼编码。

解: 根据题意,设这8个字母对应的权值分别为(5,25,4,7,9,12,30,8),并且n=8。

(1)设计哈夫曼树的步骤如图6-13所示。

C D

E F G A

B

H I

L

J K

图6-12 第一步: 25 5 4 7 9 12 30 8 第二步:

25 7 9 12 30 5

4

9

8 图6-11 C D E

F G A B H

I

L

J

K

A

B D H

C F E J I B A C

D

E

F H I J 第一步 第二步 第三步

B

A C D E F H I J 图6-10

第三步:

25 7

9 12 30

5 4

9

8 15

第四步: 25 7

9 12 30

8

15 5

4

9 18

第七步:

25 30

9

5

4 9

18

7

12

8 15

27 43

57 第八步:

25 9

5

4

9 18 43 30

7 12 8 15

27

57

100 图6-13

第五步:

25 7

9

12

30

8

15 5

4

9 18

27

第六步:

25 30

9

5

4 9

18

43

7

12

8

15 27

(2)设计哈夫曼编码

利用第八步得到的哈夫曼树,规定左分支用0表示,右分支用1表示,字母A、B、C、D、E、F、G、H的哈夫曼编码如下表示:

A:0011B:01C:0010D:1010

E:000F:100G:11H:1011

习题6

一、单项选择题

1.在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为()个。

A. 4

B. 5

C. 6

D. 7

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

A. 15

B. 16

C. 17

D. 47

3.假定一棵三叉树的结点数为50,则它的最小高度为()。

A. 3

B. 4

C. 5

D. 6

4.在一棵二叉树上第4层的结点数最多为()。

A. 2

B. 4

C. 6

D. 8

5.用顺序存储的方法将完全二叉树中的所有结点逐层存放在数组中R[1..n],结点R[i]若有左孩子,其左孩子的编号为结点()。

A. R[2i+1]

B. R[2i]

C. R[i/2]

D. R[2i-1]

6.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为()。

A. 24

B. 48

C. 72

D. 53

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

A. 逻辑

B. 逻辑和存储

C. 物理

D. 线性

8.线索二叉树中,结点p没有左子树的充要条件是()。

A. p->lc=NULL

B. p->ltag=1

C. p->ltag=1 且p->lc=NULL

D. 以上都不对

9.设n , m 为一棵二叉树上的两个结点,在中序遍历序列中n在m前的条件是()。

A. n在m右方

B. n在m 左方

C. n是m的祖先

D. n是m的子孙

10.如果F是由有序树T转换而来的二叉树,那么T中结点的前序就是F中结点的()。

A. 中序

B. 前序

C. 后序

D. 层次序

11.欲实现任意二叉树的后序遍历的非递归算法而不必使用栈,最佳方案是二叉树采用()存储结构。

A. 三叉链表

B. 广义表

C. 二叉链表

D. 顺序

12.下面叙述正确的是()。

A. 二叉树是特殊的树

B. 二叉树等价于度为2的树

C. 完全二叉树必为满二叉树

D. 二叉树的左右子树有次序之分

13.任何一棵二叉树的叶子结点在先序、中序和后序遍历序列中的相对次序()。

A. 不发生改变

B. 发生改变

C. 不能确定

D. 以上都不对

14.已知一棵完全二叉树的结点总数为9个,则最后一层的结点数为()。

A. 1

B. 2

C. 3

D. 4

15.根据先序序列ABDC和中序序列DBAC确定对应的二叉树,该二叉树()。

A. 是完全二叉树

B. 不是完全二叉树

C. 是满二叉树

D. 不是满二叉树

二、判断题

1.二叉树中每个结点的度不能超过2,所以二叉树是一种特殊的树。()

2.二叉树的前序遍历中,任意结点均处在其子女结点之前。()

3.线索二叉树是一种逻辑结构。()

4.哈夫曼树的总结点个数(多于1时)不能为偶数。()

5.由二叉树的先序序列和后序序列可以唯一确定一颗二叉树。()

6.树的后序遍历与其对应的二叉树的后序遍历序列相同。()

7.根据任意一种遍历序列即可唯一确定对应的二叉树。()

8.满二叉树也是完全二叉树。()

9.哈夫曼树一定是完全二叉树。()

10.树的子树是无序的。()

三、填空题

1. 假定一棵树的广义表表示为A(B(E),C(F(H,I,J),G),D),则该树的度为_____,树的深度为_____,终端结点的个数为______,单分支结点的个数为______,双分支结点的个数为______,三分支结点的个数为_______,C结点的双亲结点为_______,其孩子结点为_______和_______结点。

2. 设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,则B中右指针域为空的结点有_______个。

3. 对于一个有n个结点的二叉树,当它为一棵________二叉树时具有最小高度,即为_______,当它为一棵单支树具有_______高度,即为_______。

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

5. 在一棵二叉排序树上按_______遍历得到的结点序列是一个有序序列。

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

7. 在一棵二叉树中,度为0的结点个数为n0,度为2的结点个数为n2,则n0=______。

8. 一棵深度为k的满二叉树的结点总数为_______,一棵深度为k的完全二叉树的结点总数的最小值为_____,最大值为______。

9. 由三个结点构成的二叉树,共有____种不同的形态。

10. 设高度为h的二叉树中只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为____。

11. 一棵含有n个结点的k叉树,______形态达到最大深度,____形态达到最小深度。

12. 对于一棵具有n个结点的二叉树,若一个结点的编号为i(1≤i≤n),则它的左孩子结点的编号为________,右孩子结点的编号为________,双亲结点的编号为________。

13. 对于一棵具有n个结点的二叉树,采用二叉链表存储时,链表中指针域的总数为_________个,其中___________个用于链接孩子结点,_____________个空闲着。

14. 哈夫曼树是指________________________________________________的二叉树。

15. 空树是指________________________,最小的树是指_______________________。

16. 二叉树的链式存储结构有______________和_______________两种。

17. 三叉链表比二叉链表多一个指向______________的指针域。

18. 线索是指___________________________________________。

19. 线索链表中的rtag域值为_____时,表示该结点无右孩子,此时______域为指向该结点后继线索的指针。

20. 本节中我们学习的树的存储结构有_____________、___________和___________。

四、应用题

1. 已知一棵树边的集合为{},请画出这棵树,并回答下列问题:(1)哪个是根结点?

(2)哪些是叶子结点?

(3)哪个是结点g的双亲?

(4)哪些是结点g的祖先?

(5)哪些是结点g的孩子?

(6)哪些是结点e的孩子?

(7)哪些是结点e的兄弟?哪些是结点f的兄弟?

(8)结点b和n的层次号分别是什么?

(9)树的深度是多少?

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

2. 已知用一维数组存放的一棵完全二叉树:ABCDEFGHIJKL,写出该二叉树的先序、中序和后序遍历序列。

3. 找出所有满足下列条件的二叉树:

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

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

(3)它们在先序遍历和后序遍历时,得到的遍历序列相同;

4. 假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请写出该二叉树的后序遍历序列。

5. 假设一棵二叉树的后序序列为DCEGBFHKJIA,中序序列为DCBGEAHFIJK,请写出该二叉树的先序遍历序列。

6. 给出下图所示的森林的先根、后根遍历结点序列,然后画出该森林对应的二叉树。

7.给定一组权值(5,9,11,2,7,16),试设计相应的哈夫曼树。

函数递归在树形结构数据遍历中的应用

函数递归在树形结构数据遍历中的应用 我们在使用树形结构数据时,常常需要遍历整棵树或某一支下的所有结点,用于查找、打印等功能。因为树形结构不同于数组、链表等简单数据结构,它像树枝一样每个根结点可以具有多个子结点,无限延展,因此需要专门的算法去遍历。树形结构的遍历有很多种方法,下面我们以紫金桥监控组态软件(以下简称为“RealInfo”)为例,简单讲解函数递归在这种遍历方法中的应用。 在RealInfo中,“树形控件”是表示树状结构数据的组件,“自由报表”是表示表格数据的组件,这两种组件自身都提供了一些常用方法。我们现在实现这样的功能:将树形控件中的指定分支数据打印在自由报表中。可以利用窗口自定义函数的递归功能。 树形控件中的数据显示方式如下图所示: 每个结点以结点编码为唯一标识,每个结点可以显示一个字符串作为结点文本(详见RealInfo联机帮助)。 本例中,我们将树形结构数据打印在自由报表上,其效果如下图所示: 每个根结点打印完成后,遇到子结点时打印位置自动向右、向下移动一个单元格;遇到兄弟结点时打印位置向下移动一个单元格。 现在我们开始分析算法。我们知道,树的遍历是指沿着某条搜索路线,依次对树中每个

结点均做一次且仅做一次访问。这样,我们把遍历过程想象成为一次单程旅行,出发点是树的根结点,然后按先自左向右、然后自上而下的顺序,先后经过每个结点,最后走到最下方的叶子结点处。 我们可以采用这样的遍历方式: 1)当所在结点具有子结点时,那么按自左向右原则,接着访问它的第一个子结点,直到所 在结点没有子结点为止。 2)当所在结点没有子结点,但具有兄弟结点时,那么按自上向下原则依次访问它的兄弟结 点。 3)当所在结点没有子结点,而且没有兄弟结点时,那么按自上向下原则访问它父结点的兄 弟结点。 分析这个过程并观察树形结构,我们会发现,每个父结点可以拥有n(n>=0)个子结点,若将这n个子结点看作父结点,则每个父结点仍然具有n个子结点。由此看来,每一支数据乃至整棵树都可以看作是有限个父-子结构的组合。在树的遍历过程中,总是不断的重复“父→子”这一访问方式,因此我们可以提取这一方式形成一个函数,并利用函数递归来完成整个遍历。 这个函数用于根据输入的父结点编码和起始打印位置将其所有子结点打印出来。算法如下:

数据结构——二叉树的操作(遍历及树形输出)

/*实验三:二叉树遍历操作验证*/ #include #include #include #include #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 int LeafNum;//叶子结点个数 //定义结构体 typedef struct BiTNode{ char data; //存放值 struct BiTNode *lchild,*rchild; //左右孩子 }BiTNode,*BiTree; //先序输入二叉树结点的值,空格表示空树 void createBiTree(BiTree &T) { char ch; //输入结点时用 scanf("%c",&ch); if(ch==' ') //若输入空格,该值为空,且没有左右孩子 { T=NULL; }else{ T=(BiTNode *)malloc(sizeof(BiTNode)); //分配结点空间 if(!T) //分配失败 { exit(OVERFLOW); } T->data=ch; //生成根结点 createBiTree(T->lchild); //构造左子树 createBiTree(T->rchild); //构造右子树 } } //递归方法先序遍历二叉树 void preOrderTraverse(BiTree T) {

if(T) //若非空 { if(T->data) { //输出 printf("%c",T->data); } preOrderTraverse(T->lchild); preOrderTraverse(T->rchild); } } //递归方法中序遍历二叉树 void inOrderTraverse(BiTree T) { if(T) //若非空 { preOrderTraverse(T->lchild); if(T->data) { //输出 printf("%c",T->data); } preOrderTraverse(T->rchild); } } //递归方法后序遍历二叉树 void postOrderTraverse(BiTree T) { if(T) //若非空 { preOrderTraverse(T->lchild); preOrderTraverse(T->rchild); if(T->data) { //输出 printf("%c",T->data); } } } //层序遍历二叉树 void LevelTraverse(BiTree T) { queue q;//建队 q.push(T);//根节点入队

数据结构:树形结构完整代码,各种遍历方法,直接能跑

#include #include #define TElemType int typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; typedef BiTree DataType; typedef struct queuenode{ DataType data; struct queuenode *next; } QueueNode; //LINKQUEUE //HEAD POINTER, AND REAR POINTER ARE A V ALIBALE typedef struct { QueueNode *front; QueueNode *rear; } LinkQueue; int InitQueue(LinkQueue *Q); int DestroyQueue(LinkQueue *Q); int QueueEmpty(LinkQueue Q); int EnQueue(LinkQueue *Q, DataType e); DataType DeQueue(LinkQueue *Q); int CreateBiTree(BiTree *T); int PreOrderTraverse(BiTree T, int (*visit)(TElemType e)); int PreOrderTraverse2(BiTree T, int (*visit)(TElemType e)); int InOrderTraverse(BiTree T, int (*visit)(TElemType e)); int InOrderTraverse2(BiTree T, int (*visit)(TElemType e)); int PostOrderTraverse(BiTree T, int (*visit)(TElemType e)); int PostOrderTraverse2(BiTree T, int (*visit)(TElemType e)); int LevelOrderTraverse(BiTree T, int (*visit)(TElemType e)); int printElem(TElemType e); int InitBiTree(BiTree *T); int DestroyBiTree(BiTree *T); int ClearBiTree(BiTree *T); int BiTreeEmpty(BiTree T); int BiTreeDepth(BiTree T);

网站结构

今天和大家分享的是:网站结构 那这个主题我们主要还是会分为五大类: 1、我们要去了解网站结构的定义 2、网站结构对于SEO的影响,包括哪些方面? 3、那如何帮助我们去新建一个网站的时候要网站的架构注意些什么?或者说怎么去决定这些架构? 4、也会列举些常见的网站结构上的一些错误 5、最后要分享的是wordpress,它是如何通过固定链接去修改它的链接结构的。 那第一块的话是网站结构的一个定义。 通俗来讲,网站基本可以分为三个结构: 第一个是我们的物理结构:那物理结构主要是体现于真实网页在主机端上它的一个位置。那包括比如说当我们来到我们网站的时候,这是它的首页A,首页下面会有一个目录B,在目录下面会有不同的小页面,那这样是我们称为一个物理结构。那物理结构是在上传你网站文件的时候所处在的这么一个位置,啊~所以他是真实的存在的。 那第二个结构是我们的内链结构,因为我们知道当网站把页面上传到主机端上之后,在用户端或是前端我们看到的页面事实上是传上去这个页面以后所展现的内容,那这样的内容它是可以根据不同级别下面的页面进行这样一个所谓链接的这样一个贯通。因此,内链的结构其实是网页之间的一个枢纽的管道。这里比如说在我们的B栏目下面会有一个D页面,那D 页面原则上从物理结构来讲的话那它是在B下面的,但我们的D页面只要是内容里面有一个内部链接通向我们的C栏目的话,那这样的一个结构就可以看作是我们的一个内链的结

构。那第三个是URL的结构,URL结构的话区别主要是体现说当我们去访问页面的时候,我们在浏览器上方总会是一个URL地址的,而这个地址其实他能代表我们物理结构,那有时候它也是可以不代表我们物理结构的,那比如说像这样的动态页面的时候,那所有的这块内容其实它是抓取它数据库里面的内容,而数据库内容其实不是在我们物理结构里面的。因此网站结构里面少不了我们这样一个URL结构,而URL结构我们通常会说动态的URL去变成一个静态或者伪静态的URL,就比如像这个例子,那之前是ID=22这么一个产品,我们可以把URL重新写或重新替换成d22.html这样一种形式。所以,总体来讲的话,当我们提到网站结构的时候事实上它不仅是我们传统意义上想到网站长成什么样子?事实上它更多牵扯到整体网页部分一个物理的架构,包括物理架构里所有页面里面的相互贯穿的这些内链或内部链接的这么一个结构。那第三块才是我们说有了真实的文件有了文件里面的内链结构,随后那用户去访问的时候这个时候URL结构是什么样的?所以说网站三大结构的话主要是会有这三块。 那我们如何去看我们的物理结构呢?事实上会做网站的基本上会用我们称为FTP这么个工具去上传所有的你本地做好的文件,上传到不管是你的虚拟主机啊还是独立主机,那通常我们会用比如说像这样filezilla像这样的一个工具,它是可以去免费的让我们站长使用,那使用这工具的时候,任何网站它都会有一个主机地址,所以你把主机地址填进去,随后你的网站会有一个用户名和密码的,那基本上只要有这三项信息的话,你就可以去链接到你网站所在的那个主机,那登上去之后的话你就可以看到你整个主机上面的原始的这么一个物理结构了,那一开始的话你没有放网站的话,可能就是非常简单的,譬如说,大无风网的虚拟主机它会是一个public gate目录,所以就是在这个目录下面可以把你所有网站里面的内容给丢上去或者是上传上去,其实物理结构的话就是,他更多的就是通过FTP文件或者是网站,

java递归树型结构通用数据库

表结构 /** * 删除部门删除时从选中级的所有子级 * * @param dept * @return */ public JsonResult delDept(Dept dept) { JsonResult jr = new JsonResult(); Boolean flags=true; try { String str = ""; User user=new User(); List sortList = new ArrayList(); sortList.add(dept); getDeptSortList(sortList,dept.getId()); //起始根节点id,等级为0 for(Dept bean: sortList){ user.setDeptId(bean.getId()); //判断部门下面是否有用户 List users =userDao.getByDeptIdIsUerOrNO(user); int userSize=users.size(); if(userSize>0){ jr.setMessage("部门名称:(" + users.get(0).getDeptName() + ")已有用户不能删除"); flags=false;

break; } } //部门没有被用户使用时才可以册子 if(flags){ for(Dept bean: sortList){ dept.setId(bean.getId()); deptDao.delDept(dept); jr.setMessage(SuccessMessageEnum.detele.toDescription()); } } jr.setSuccess(true); } catch (Exception e) { log.error("DeptServiceImpl-->delDept:" + e.getMessage()); jr.setCode(ExceptionEnum.SystemError.toCode()); jr.setMessage(e.getMessage()); } return jr; } /** * 删除时递归部门树 * * @param * @return */ public void getDeptSortList(List sortDeptList,Integer parentId)throws Exception { Dept bean = null; //根据选中的部门id得到本部门和第一级所有的子部门的id List deptslist=deptDao.getByDeptIdAllSubDeptId(parentId); //;//每次查询出上级为的分类 // int deptSize=deptslist.size(); if(deptslist.size() > 0){ for(int i=0;i select id from report_sys_dept where parent_id=#value#

树形目录结构文件系统

操作系统课程设计 课程名称操作系统 题目名称树形目录结构文件系统学生学院 专业班级 学号 学生姓名 指导教师 2011 年1 月13 日

目录 一、课程设计目的 (3) 二、设计概要 (3) 三、详细设计 (3) 3.1数据结构设计 (4) 3.2程序功能模块图 (5) 3.2.1 文件管理系统主功能图示 (5) 3.2.2 用户界面管理图示 (5) 3.2.3 新建文件图示 (6) 3.2.4 复制、剪切文件图示 (6) 3.2.5 粘贴文件图示 (7) 3.2.6 删除文件图示 (7) 四、程序界面设计及运行结果分析 (8) 五、课程设计总结 (12) 六、参考文献 (12)

一、课程设计目的: 操作系统课程设计是配合操作系统课开设的专业基础必修课。本课程通过设计实现一个综合作业,培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。 二、设计概要: (1) 运行平台: Windows系列 (2) 设计平台: Microsoft Visual Studio 2008 (3) 存储系统:XML文件 (4) 运行需求: .NET Framework 2.0版本以上 (5) 软件简介: 文件管理系统 (6) 功能简介: A、提供用户登录注销功能 B、多用户管理,多级目录形式,文件可互相共享. C、智能化的树形和列表界面操作(包括图标、列表以及详细显示方 式,方便的菜单,右击菜单,工具栏等) D、模拟Windows多种实用功能 (7)本系统参照了windwos文件管理结构,实现了其大部分常用功能,采用多用户系统实现了文件夹与文件的创建,打开,读写,删除,关闭,剪切,复制,粘贴,重命名,刷新,查看,排列图标、属性设置、模糊搜索以及多用户文件共享功能。 三、详细设计: 3.1、数据结构设计: 本程序采用XML文件形式管理文件信息,XML文件适合小数据块的存储和传输,.NET为XML提供了丰富的类库,更加方便了操作使用,详细数据设计思路如下: XML文件编码声明: 首节点: 用户设计: 两个数据段:用户名和用户密码; XML实现: 文件夹设计: 一个数据段:文件夹名称 XML实现: 文件设计: 四个数据段:文件名称、文件保护码、文件空间和文件共享性

树形图(句法)

树形图详细讲解 1. Indicate the category of each word in the following sentences. a) The old lady suddenly left. Det A N Qual V b) The car stopped at the end of the road. Det N V P Det N P Det N c) The snow might have blocked the road. Det N Aux Aux V Det N d) He never appears quite mature. N Qual V Deg A 2. The following phrases include a head, a complement, and a specifier. Draw the appropriate tree structure for each. a) full of people AP A P N full of people b) a story about a sentimental girl NP NP PP Det N P NP Det A N a story about a sentimental girl c) often read detective stories VP Qual V NP A N often read detective stories

d) the argument against the proposals NP NP PP Det N P NP Det N the argument against the proposals e) move towards the window VP V PP P Det N move towards the window 3. Draw phrase structure trees for each of the following sentences. a) The jet landed. InflP(=S) NP Infl VP Det N Pst V The jet landed b) Mary became very ill. InflP(=S) NP Infl VP N Pst V AP Deg A Mary became very ill

树型结构

数据结构练习——树型结构姓名: 1.按照二叉树的定义,具有3个结点的二叉树有()种。 A 3 B 4 C 5 D 6 2.若在一个森林中有N个结点,K条边(N>K),则该森林中必有()棵树。 A K B N C N-K D 1 3.在下列存储形式中,()不是树的存储形式。 A 双亲表示法 B 孩子链表表示法 C 孩子兄弟表示法 D 顺序表示法 4.设二叉树只有度为0和2的结点,其结点个数为15,则该二叉树的最大深度为()。 A 4 B 5 C 8 D 9 5.一个具有767个结点的完全二叉树,其叶子结点个数为()。 A 383 B 384 C 385 D 386 6.若一棵二叉树有126个结点,在第7层至多有()个结点。 A 32 B 64 C 63 D 不存在第7层 7.若一棵度为7的树有8个度为1的结点,7个度为2的结点,6个度为3的结点,5个度为4的结点,4个度为5的结点,3个度为6的结点,2个度为7的结点,则该树一共有()个叶子结点。 A 35 B 28 C 77 D 78 8.已知完全二叉树的第7层有10个叶子结点,则整个二叉树的结点数最多是() A 73 B 127 C 235 D 255 9.任何一棵非空二叉树中的叶子结点在先序遍历、中序遍历、后序遍历的相对位置() A 都会发生变化 B 不会发生变化 C 有可能发生变化D部分发生变化 10.对于二叉树的两个结点X和Y,应该选择()两个序列判断X是否为Y的祖先。 A 先序和后序 B 先序和中序 C 中序和后序 D A、B、C都行 11.深度为5的二叉树上至多有()个结点。 A. 16 B. 32 C. 31 D. 10 12.二叉树的中序序列为ABCDEFG,后序序列为BDCAFGE,则先序序列为() A. EGFACDB B. EACBDGF C. EAGCFBD D. 上面都不对 13.在线索二叉树中,t所指结点没有左子树的充要条件是()。 A. t->lchild==NULL B. t->ltag==1 C. t->ltag==1&& t->lchild==NULL D. 上面都不对 14.由权值为9、2、5、7的四个叶子构造一棵哈夫曼树,该树的带权路径长度为() A 23 B 37 C 44 D 46 15.有五个字符,根据其使用频率设计对应的哈夫曼编码,()是不可能的哈夫曼编码。 A 000,001,010,011,1 B 0000,0001,001,01,1 C 000,001,01,10,11 D 00,100,101,110,111 16. 若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右孩子的两个指针。在这种存储结构中,n个结点的二叉树共有________个指针域,其中有________个指针域是存放了地址,有________________个指针是空指针。 17. 一棵高度为5的二叉树中最少含有_________个结点,最多含有________个结点; 18.设一棵二叉树的前序遍历序列和中序遍历序列均为ABC,则该二叉树的后序遍历序列为__________。 19.设一棵完全二叉树中有21个结点,如果按照从上到下、从左到右的顺序从1开始顺序编号,则编号为8的双亲结点的编号是___________,编号为8的左孩子结点的编号是_____________。 20 已知一棵二叉树的先序和中序序列,求该二叉树的后序遍历序列 先序遍历:A,B,C,D,E,F,G,H,I,J 中序遍历:C,B,A,E,F,D,I,H,J,G 后序遍历:______________________

[TREE]采用左右值编码来存储无限分级树形结构的数据库表设计

采用左右值编码来存储无限分级树形结构的数据库表设计 之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上) 该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。 上面的设计方案必须预先设定类别树的最大层数以及最大子节点数,不是无限分级,在某些场合并不能采用,那么还有更完美的解决方案吗?通过google的搜索,我又探索到一种全新的无递归查询,无限分级的编码方案——左右值。原文的程序代码是用php写的,但是通过仔细阅读其数据库表设计说明及相关的sql语句,我彻底弄懂了这种巧妙的设计思路,并在这种设计中新增了删除节点,同层平移的需求(原文只提供了列表及插入子节点的sql语句)。 下面我力图用比较简短的文字,少量图表,及相关核心sql语句来描述这种设计方案: 首先,我们弄一棵树作为例子: 商品 |---食品 | |---肉类 | | |--猪肉 | |---蔬菜类 | |--白菜 |---电器 |--电视机 |--电冰箱

select count(*) from tree where lft <= 2 and rgt >= 11 为了方便列表,我们可以为tree表建立一个视图,添加一个层数列,该类别的层数可以写一个自定义函数来计算。该函数如下: CREATE FUNCTION dbo.CountLayer ( @type_id int ) RETURNS int AS begin declare@result int set@result=0 declare@lft int declare@rgt int if exists (select1from tree where type_id=@type_id) begin select@lft=lft,@rgt=rgt from tree where type_id=@type_id select@result=count(*) from tree where lft <=@lft and rgt >=@rgt end return@result end GO 然后,我们建立如下视图: CREATE VIEW dbo.TreeView AS SELECT type_id, name, lft, rgt, dbo.CountLayer(type_id) AS layer FROM dbo.tree ORDE R BY lft GO

实验四 利用树型结构的搜索算法模拟因特网域名的查询

实验四利用树型结构的搜索算法模拟 因特网域名的查询 问题描述 在第六章树结构中曾讨论Internet的域名系统,以树型结构实现域名的搜索。即输入某站点的域名,在域名系统的树型结构中进行搜索,直至域名全部匹配成功或匹配失败;若成功则给出该站点的IP地址,否则给出找不到该站点的信息。 基本要求 首先要实现一个反映域名结构的树,例如中国科学技术大学https://www.360docs.net/doc/7e17250095.html,在该树从根到叶子的各层结点就应是root、cn、edu、ustc、www。叶子结点www另有一个数据域,存放中国科学技术大学站点的IP地址202.38.64.2。 测试数据 可以取常用到的著名站点的域名和IP地址为例构建域名结构的树,一般应有20个左右的站点域名。下面提供了一组测试数据,当输入“https://www.360docs.net/doc/7e17250095.html,”输出为“202.38.64.2”;而输入https://www.360docs.net/doc/7e17250095.html,时,输出应为“找不到服务器或发生DNS错误”。https://www.360docs.net/doc/7e17250095.html, 220.181.27.5 https://www.360docs.net/doc/7e17250095.html, 66.249.89.104 https://www.360docs.net/doc/7e17250095.html, 207.46.20.60

https://www.360docs.net/doc/7e17250095.html, 64.215.166.127 https://www.360docs.net/doc/7e17250095.html, 210.254.57.56 https://www.360docs.net/doc/7e17250095.html, 219.239.195.11 https://www.360docs.net/doc/7e17250095.html, 218.30.13.51 https://www.360docs.net/doc/7e17250095.html, 202.38.64.2 https://www.360docs.net/doc/7e17250095.html, 202.38.64.3 https://www.360docs.net/doc/7e17250095.html, 162.105.129.12 https://www.360docs.net/doc/7e17250095.html, 162.105.204.150 https://www.360docs.net/doc/7e17250095.html, 166.111.4.100 https://www.360docs.net/doc/7e17250095.html, 166.111.8.229 https://www.360docs.net/doc/7e17250095.html, 210.73.64.10 https://www.360docs.net/doc/7e17250095.html, 61.129.65.58 实现提示 树的存储结构采用孩子兄弟链表。 二叉链表的树结构是一种动态结构,除第一次生成的过程需要人工输入数据外,以后每次进行搜索查询时,应首先从文件中保存的数据自动生成树的结构。为解决二叉链表与文件之间的转换,可以通过先序遍历的办法保存和恢复二叉链表。例如一个二叉链表的文件保存形式如下:

网页树形列表设计

树型结构在程序的布局当中,应用十分广泛,但是也十分的男,所在我们就来研究一下,关于树型结构的一些知识。 在B/S结构当中,树的应用相对简单一些,主要是利用JS来完成。我们可以静态的写一个树,也可以连接数据库,动态生成一个树。好了,我们先来看一下各个图片。

上面就是我们这个程序的最主要的部分,删除和更新权限功能,也已经实现了。左方的树,有相应的连接,点击就可以看到相应的用户,和其子用户的信息。因为时间很多,做得也不够细致。有些功能,实现的并不严谨。比如说,我们在删除用户的时候,没有进行权限验证,包括更新用户,添加用户,查看用户信息等,都应该做出很严密的逻辑判断来。因为时间的关系,这里只是简单的实现了功能模块,细化的工作,我会逐渐完成的。 下面把最主要的代码给大家。 Main.jsp <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+ "/"; %> My JSP 'main.jsp' starting page

常用数据库的树形查询

常用数据库的树形查询 在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现方法 表recursion数据如下: id name parentid 1 食品分类 -1 2 肉类 1 3 蔬菜类 1 4 产品分类 -1 5 保健品 4 6 医药 4 7 建筑 4 一ORACLE中实现方法: Oracle中直接支持,使用语句select * from tablename start with connect by prior id(子层的列)=parentid(属于顶层的列) 语句说明: start with 指定层次开始的条件,即满足这个条件的行即可以作为层次树的最顶层 connect by prior指层之间的关联条件,即什么样的行是上层行的子行(自连接条件) 实例: select * from recursionstart with connect by prior>查询结果: id name parentid 1 食品分类 -1 2 肉类 1 3 蔬菜类 1 二MSSQL中的实现方法 在MSSQL中需要使用临时表和循环多次查询的方式实现. 创建函数: create function GetRecursion(@id int) returns @t table( idint, namevarchar(50), parentidint ) as begin insert @tselect * from recursion where> while @@rowcount>0 insert @t select a.* from recursion as a inner join @t as b on a.parentid=b.id and a.id not in(select id from @t) return end 使用方法:

树形结构数据表的设计

树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化。然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree 存入DBMS,设计合适的Schema及其对应的CRUD算法是实现关系型数据库中存储树形结构的关键。 理想中树形结构应该具备如下特征:数据存储冗余度小、直观性强;检索遍历过程简单高效;节点增删改查CRUD操作高效。无意中在网上搜索到一种很巧妙的设计,原文是英文,看过后感觉有点意思,于是便整理了一下。本文将介绍两种树形结构的Schema设计方案:一种是直观而简单的设计思路,另一种是基于左右值编码的改进方案。 一、基本数据 本文列举了一个食品族谱的例子进行讲解,通过类别、颜色和品种组织食品,树形结构图如下:

二、继承关系驱动的Schema设计 对树形结构最直观的分析莫过于节点之间的继承关系上,通过显示地描述某一节点的父节点,从而能够建立二维的关系表,则这种方案的Tree表结构通常设计为:{Node_id,Parent_id},上述数据可以描述为如下图所示: 这种方案的优点很明显:设计和实现自然而然,非常直观和方便。缺点当然也是非常的突出:由于直接地记录了节点之间的继承关系,因此对Tree的任何CRUD操作都将是低效的,这主要归根于频繁的“递归”操作,递归过程不断地访问数据库,每次数据库IO都会有时间开销。当然,这种方案并非没有用武之地,在Tree规模相对较小的情况下,我们可以借助于缓存机制来做优化,将Tree的信息载入内存进行处理,避免直接对数据库IO操作的性能开销。 三、基于左右值编码的Schema设计 在基于数据库的一般应用中,查询的需求总要大于删除和修改。为了避免对于树形结构查询时的“递归”过程,基于Tree的前序遍历设计一种全新的无递归查询、无限分组的左右值编码方案,来保存该树的数

网络拓扑结构大全和图片(星型、总线型、环型、树型、分布式、网状拓扑结构)

网络拓扑结构总汇 星型结构 星型拓扑结构是用一个节点作为中心节点,其他节点直接与中心节点相连构成的网络。中心节点可以是文件服务器,也可以是连接设备。常见的中心节点为集线器。 星型拓扑结构的网络属于集中控制型网络,整个网络由中心节点执行集中式通行控制管理,各节点间的通信都要通过中心节点。每一个要发送数据的节点都将要发送的数据发送中心节点,再由中心节点负责将数据送到目地节点。因此,中心节点相当复杂,而各个节点的通信处理负担都很小,只需要满足链路的简单通信要求。 优点: (1)控制简单。任何一站点只和中央节点相连接,因而介质访问控制方法简单,致使访问协议也十分简单。易于网络监控和管理。 (2)故障诊断和隔离容易。中央节点对连接线路可以逐一隔离进行故障检测和定位,单个连接点的故障只影响一个设备,不会影响全网。 (3)方便服务。中央节点可以方便地对各个站点提供服务和网络重新配置。 缺点: (1)需要耗费大量的电缆,安装、维护的工作量也骤增。 (2)中央节点负担重,形成“瓶颈”,一旦发生故障,则全网受影响。 (3)各站点的分布处理能力较低。 总的来说星型拓扑结构相对简单,便于管理,建网容易,是目前局域网普采用的一种拓扑结构。采用星型拓扑结构的局域网,一般使用双绞线或光纤作为传输介质,符合综合布线标准,能够满足多种宽带需求。 尽管物理星型拓扑的实施费用高于物理总线拓扑,然而星型拓扑的优势却使其物超所值。每台设备通过各自的线缆连接到中心设备,因此某根电缆出现问题时只会影响到那一台设备,

而网络的其他组件依然可正常运行。这个优点极其重要,这也正是所有新设计的以太网都采用的物理星型拓扑的原因所在。 扩展星型拓扑: 如果星型网络扩展到包含与主网络设备相连的其它网络设备,这种拓扑就称为扩展星型拓扑。 纯扩展星型拓扑的问题是:如果中心点出现故障,网络的大部分组件就会被断开。

树形结构数据排序算法

需求是把数组按照树形结构排列,假设数据是在数据库中的。 最简单的思路或者说常规的思路就是递归算法了。递归算法是比较快的和准确的,但是有一个问题就是会比较浪费不必要的资源,递归算法执行的过程中会开启 N个函数入口,也就是函数需要一直保存状态等待起递归的运算结果。例如这 个树形有 5层*60行,则在递归算法中浪费的运算至少60次,并且保持5个函 数一直是运算中状态,不合理的是同样要做60+次的数据库查询,因为不管其有没有子类,算法执行过程中都需要去重复执行递归运算,事实上实际执行过程 中不止这个数。 可以写个简单的例子来测试递归算法调用函数的次数。 /* 先假设我的数据是这样子的 array( array(id=>1,pid=>0), array(id=>2,pid=>0), array(id=>3,pid=>2), array(id=>4,pid=>0), array(id=>5,pid=>3), array(id=>6,pid=>1), array(id=>7,pid=>1), array(id=>8,pid=>6), array(id=>9,pid=>7), array(id=>10,pid=>9) ); */ $db = new MysqlDb(); $num = 0; function treeArray($pid) { global $db, $num; $num++; $data = $db ->getAll("SELECT * FROM test_a WHERE pid = ".$pid); //返回一个二维数组 $result = array(); foreach($data as $val) { $val['child'] = treeArray($val['id']); $result[] = $val; } return $result; } print_r(treeArray(0)); //树形的结果 var_dump($num); //11 然后我们系统越作越大了,数据库资源紧张了,我们要求在不改变数据库结构的同时尽可能 的减少数据库的操作。那么这样做就需要我们有一算法来给你的数据排序了。

树形数据结构及其应用

淮海工学院计算机工程学院实验报告书 课程名:《数据结构》 题目:树形数据结构及其应用 班级: 学号: 姓名:

实验2树形数据结构 实验目的和要求 1.熟练掌握二叉树的二叉链表存储结构;二叉树的常用遍历方法:按层遍历、先序递归遍历、中序递归和非递归遍历、后序递归遍历。 2.掌握按先序遍历顺序输入数据,递归建立二叉树的方法。 3. 掌握建立哈夫曼树的方法,实现哈夫曼编码。 实验环境 Turbo C 或VC++ 实验学时 4学时,必做实验 实验题目 1.[问题描述] 建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中 序和后序),打印输出遍历结果。 [基本要求] 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采用递归和非递归两种方法实现。 [测试数据] ABCффDEфGффFффф(其中ф表示空格字符) 输出结果为:先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA 2.已知二叉树按照二叉链表方式存储,编写算法,要求实现二叉树的竖向显示(竖向显示就是二叉树的按层显示)。 [提示]: (1)参习题6.20,实现逐层遍历 (2)队中保存每个结点的打印位置,其左、右子的距离 3.如题1要求建立好二叉树,按凹入表形式打印二叉树结构,如图6.34所示。 A B C D E 图6.34 F

主要数据结构 1. typedef char DataType; typedef struct Node { DataType data; struct Node *LChild; struct Node *RChild; }BiTNode, *BiTree; 2. ypedef BiTree QueueElementType; typedef struct { QueueElementType element[MAXSIZE]; /* 队列的元素空间*/ int front; /*头指针指示器*/ int rear; /*尾指针指示器*/ }SeqQueue; 3.void InitQueue(SeqQueue *Q)/*初始化操作*/ 4.int EnterQueue(SeqQueue *Q, QueueElementType x)/*入队操作*/ 5.int DeleteQueue(SeqQueue *Q, QueueElementType *x)/*出队操作*/ 6.int LayerOrder(BiTree bt) 7.InitQueue(Q); /*初始化空队列Q*/ 8.void CreateBiTree(BiTree *bt) 9.void PreOrder(BiTree root)//先序遍历二叉树 10.void InOrder(BiTree root)//中序遍历二叉树 11.void PostOrder(BiTree root)//后序遍历二叉树 12.int CreateBiTree(BiTree &T) //创建一棵非空二叉树 13.void PrintTree(BiTree Boot,int nLayer) /* 打印二叉树*/ 主要算法 1.用递归和非递归进行遍历(先序、中序、后序) 2.按图进行遍历 3.用队列编写二叉链表存储:初始化、入队、出队 运行结果 1.递归 非递归

相关文档
最新文档