树结构

树结构
树结构

第3章树结构

3.2 习题

3.2.1 填空题

3-1已知(L,N),(G,K),(G,L),(G,M),(B,E),(B,F),(D,G),(D,H),(D,I),(D,J),(A,B),(A,C),(A,D)是表示一棵树中具有父子关系的边,那么:

(1)树的根、叶、非叶结点分别是__________。

(2)树的高度为______________。

(3)各个结点的度数分别是_____________。

(4)各个结点的层数分别是_____________。

(5)结点G的父亲、真祖先、儿子、真子孙、兄弟分别是__________。

3-2含3个结点的普通树的树形共有(1)____种,其树形分别为(2)__________。

3-3含3个结点的二叉树的树形共有(1)____种,其树形分别为(2)___________;其中有(3)____个是完全二叉树。

3-4图3-1中:

二叉树1的先序、中序、后序序列分别为:(1)_____________。

二叉树2的先序、中序、后序序列分别为:(2)_____________。

图3-1

3-5任何二叉树的叶结点在先序、中序和后序序列中的相对次序_____。

3-6由二叉树的先序序列和中序序列,求后序序列:

先序序列ABDGCEF,中序序列DGBAECF,后序序列是(1)___________。

先序序列ABEFGCD,中序序列BFEGADC,后序序列是(2)___________。

3-7由二叉树的后序序列和中序序列,求先序序列:

后序序列DBKHFEGCA,中序序列DBAKHEFCG,先序序列是(1)__________。

后序序列HGFBEDCA,中序序列HFGBAECD,先序序列是(2)__________。

3-8由正则二叉树的先序序列和后序序列,求中序序列:

先序序列ABCDE,后序序列BDECA,中序序列是(1)__________。

先序序列ABCDFGHKE,后序序列BFHKGDECA,中序序列是(2)__________。3-9已知二叉树的先序序列是15,5,3,10,8,11,18,24,而后序序列是3,8,11,10,5,24,18,15,除结点18只有右儿子而无左儿子之外,其余每个非叶结点均有两个儿子。那么,它的中序序列是____________。

3-10已知二叉树的扩充先序序列是“ABC空空DE空FG空空空空空”。那么,它的中序序列是(1)__________,后序序列是(2)_________。

3-11(1)已知检索树的先序序列是18,16,8,29,21,27,38,那么,它的后序序列是________________。

(2)已知检索树的后序序列是12,21,19,67,45,23,那么,它的先序序列是________________。

3-12由输入序列46,70,25,15,28,10,36,78,55所构造的检索树,其先序序列是(1)_____________,后序序列是(2)___________。在此树上插入结点30和32后,它的先序序列是(3)___________。再删除结点46,它的后序序列是(4)__________。

3-13由权14,7,8,2,5,4,23所构造的Huffman树为(1)________,该树的权W(T)=(2)__________(要列出计算步骤)。

3-14已知字符集{A,B,C,D,E,F}各字符的Huffman编码依次是011,010,10,001,11,000,那么,对编码序列“01011011000111011001”的译码结果是___________。

答案

3-1此题所描述的树结构如图3-2所示

图3-2

(1)根结点:A ;叶结点:E、F、C、K、N、M、H、I、J;非叶结点:B、D、G、L;

(2)5

(3)度为0的结点:E、F、C、K、N、M、H、I、J;度为1的结点:L;度为2的结点:B;度为3的结点:A、G;度为4的结点:D

(4)层数为1的结点:A;层数为2的结点:B、C、D;层数为3的结点:E、F、G、H、I、J;层数为4的结点:K、L、M;层数为5的结点:N

(5)D,A、D,K、L、M,K、L、M、N,H、I、J

3-2(1)2

(2)如图3-3所示:

图3-3

3-3(1)5

(2)如图3-4所示:

图3-4

(3)1

3-4(1)ABDGCEFH,DGBAECHF,GDBEHFCA (2)ABDEFCG,DFEBAGD,FEDBGCA 3-5 是一致的

3-6(1)GDBEFCA (4)FGEBDCA

3-7(1)ABDCEHKFG (2)ABFHGCED

3-8(1)BADEC (2)BAFDHGKCE

3-9 3,5,8,10,11,15,18,24

3-10(1)CBEGFDA (2)CGFEDBA

3.11(1)8,16,27,21,38,29,18 (2)23,19,12,21,45,67

3-12(1)46,25,15,10,28,36,70,55,78

(2)10,15,36,28,25,55,78,70,46

(3)46,25,15,10,28,36,30,32,70,55,78

(4)10,15,32,30,28,25,55,78,70,36

3-13(1)如图3-5所示:

图3-5

(2)(14+23)×2+(5+7+8)×3+(2+4)×4=158

(3)如图3-6所示:

图3-6

3-14 BEAFECED

3.2.3 选择题

3-15k层满三元树的结点数为____。

A.(k3-1)/2 B.k3-1 C.(k3-1)/3 D.k3

3-16高为h的m元树(m≥2,h≥1)的第i层上结点数n i(1)_____,树中结点总数n (2)_____。

(1)A.≤m i B.≤m i-1C.≤m i+1D.≥m i-1

(2)A.≤m h+1-1 B.≥m h+1-1 C.≤(m h-1)/(m-1) D.≤m h/(m-1)

3-17若三元树中,度数为1,2,3的结点数分别是2,1,3。叶子数必为____个。

A.4 B.5 C.6 D.7

3-18图3-7中,_____都是完全二叉树。

A .1和4

3

1

(1) (2) (3) (4)

图3-7

3-19 对普通树先根遍历的规则是:先访问根结点,再依次遍历根的各个子树;后根遍历的规则是:先依次遍历根的各个子树,再访问根结点。

对普通树T 先根遍历和后根遍历得到先根序列和后根序列,

与将T 转换成二叉树B 的先序序列、中序序列、后序序列之间的关系是_____。

A .T 的先根序列与

B 的先序序列相同 B .T 的后根序列与B 的后序序列相同

C .T 的先根序列与B 的中序序列相同

D .无简单的对应关系

3-20 图3-8所示的二叉树是由某森林转换而来的,那么原森林中,共有(1)_____棵树,共有(2)_____片叶子。

A .3

B .4

C .5

D .6

图3-8

3-21 若二叉树中,2度结点数为m ,则叶子数为____。

A .m

B .m+1

C .2m

D .不确定

3-22 若k 元正则树中共有m 个非叶结点,则叶子数________。

A .≥(k -1)m

B .≤km

C .=(k -1)m -1

D .=(k -1)m+1

3-23 高度为h 的正则二叉树至少有_____结点。

A .2h

B .2h -1

C .2h +1

D .2h+1

3-24 二叉树的中序序列之中,根结点r 的右边_____。

A .只有r 所有的右子孙

B .只有r 的一部分右子孙

C .只有r 的一部分左子孙

D .只有r 所有的左子孙

3-25 二叉树的中序序列之中,结点a 排在结点b 之前的条件是_____。

A.a在b右方B.a是b祖先

C.a在b左方D.a是b子孙

3-26(1)将元素“50,30,15,35,70,65,95,60,25,40”依次插入开始为空的检索树,之后再逐一对它们进行查找,那么平均查找长度为____。

(2)(1)将元素“42,30,74,56,15,60”依次插入开始为空的检索树,那么不成功查找的平均查找长度为____。

(1)A.2.5 B.3.2 C.2.9 D.2.7

(2)A.3 B.4 C.15/6 D.21/6

3-27字母ABCDE的不等长编码不可能是_____。

A.111,110,10,01,00 B.000,001,010,011,1

C.100,11,10,1,0 D.001,000,01,11,10

3-28用权:2,12,4,14,3,16,构造Huffman树,则W(T)=____。

A.123 B.110 C.102 D.116

答案

3-15 A

3-16 (1)B (2)C

3-17 D

3-18 A

3-19 A

3-20 (1)B (2)D

3-21 B

3-22 D

3-33 A

3-24 C

3-25 C

3-26 (1)C (2)A

3-27 C

3-28 D

3.2.3 基本概念题

3-29画出所有含5片叶子的完全二叉树的树形,并对任意含n(n>0)片叶子的完全二叉树

的树形得出一般性结论。

答案

图3-9

如图3-9所示,具有n片叶子的完全二叉树共有2个。

对任意n>0,具有n片叶子的完全二叉树的树形都各有2棵。一棵是正则完全二叉树,为该树第一片叶(编号最小的叶)加一个左儿子得另一棵树。

3-30(1)画出图3-10中由3棵树组成的森林所转换成的二叉树。

图3-10

(2)画出图3-11中二叉树所转换成的普通树(或森林)。

图3-11

答案(1)转换成为的二叉树如图3-12所示:

图3-12

(2)转换成为的森林图3-13所示:

图3-13

3-31已知二叉树的先序序列是15,5,3,10,8,18,24;后序序列是3,8,10,5,24,18,15;树中共有三片叶(3,8,24),而根结点和另外一个结点的度数为2。其余结点度

数为1。试画出所有满足上述条件的二叉树。

答案

如图3-14所示,8既可做10的左儿子,也可做10的右儿子;24既可做18的左儿子,也可做18的右儿子;

图3-14

3-32图3-15中,数组T存储着一棵二叉树,根指针为Root(值等于4),-1为空链域。

试画出该树的逻辑图(即树形图),并指出它是不是完全二叉树。

数组 T

下标

4

Root

图3-15

答案 如图图3-16所示,不是完全二叉树。

图3-16

3-33 证明对于任何k 元正则树,结点数必等于k 的某个倍数加1。关于其叶子数目,能得出什么结论? 答案

【证明】设k 元正则树的结点个数为n ,边数为m ,n k ,n 0分别为分枝结点数和叶子结点数,则m=n-1=n k +n 0-1=mn k ,所以,n 0=(m-1)n k +1,因此,n=n k +n 0=n k +(m-1)n k +1=mn k +1,得证。

3-34 证明非空二叉树中,叶子数等于2度结点数加1。 答案

【证明】设非空二叉树的结点个数为n>0,边数为m ,n 2,n 1,n 0分别为二度、一度和叶子结点数,则m=n-1=n 2+n 1+n 0-1=2n 2+n 1,所以,n 0=n 2+1,得证。

3-35 简述二叉树的右先序(右中序、右后序)序列与其左先序(中序、后序)序列之间的对应关系。 答案

设二叉树的先序序列、右先序序列分别为: a 1a 2…a L a L+1…a n ,b 1b 2…b R b R+1…b n

则a 1=b 1,a 2…a L 与 b R+1…b n 是根结点的左子树的先序序列、右先序序列,则n-(R+1)=L-1,所以,L=n-R ,R=n-L ,且a 2=b R+1=b n-L+1,类似地可以求出以a 2为根结点的左子树的先序序列、右先序序列的对应关系,依此类推,可以找出二叉树的根结点的左子树中的所有结点在先序序列、右先序序列中的对应关系。

同理,可得到二叉树的根结点的右子树中的所有结点在先序序列、右先序序列中的对应关系。

设二叉树的中序序列、右中序序列分别为: a 1a 2…a m-1a m a m+1…a n ,b 1b 2…b k-1b k b k+1…b n

设a m =b k 是树的根结点,则a 1…a m-1与 b k+1…b n 是根结点的左子树的中序序列、右中序序列,则m-1=n-(k+1)+1=n-k ,即k=n-m+1,类似地可以求出以左子树a 1…a m-1的根结点的左子树的先序序列、右先序序列的对应关系,依此类推,可以找出二叉树的根结点的左子树中的所有结点在中序序列、右中序序列中的对应关系。

同理,可得到二叉树的根结点的右子树中的所有结点在中序序列、右中序序列中的对应关系。

设二叉树的后序序列、右后序序列分别为: a 1…a L a L+1…a n-1a n ,b 1…b R b R+1…b n-1b n

则a n =b n ,a 1…a L 与 b R+1…b n-1是根结点的左子树的后序序列、右后序序列,则(n-1)-(R+1)=L-1,所以,L=n-R-1,R=n-L-1,且a L =b n-1,类似地可以求出以a L 为根结点的左子树的后序序列、右后序序列的对应关系,依此类推,可以找出二叉树的根结点的左子树中的所有结点在后序序列、右后序序列中的对应关系。

同理,可得到二叉树的根结点的右子树中的所有结点在后序序列、右后序序列中的对应关系。

*3-36 证明具有相同先序序列的二叉树共有C(2n,n)/(n +1)棵。 答案

[证明]设二叉树先序序列为a 1a 2……a n ,在二叉树的先序遍历递归算法中,其先序序列就为遍历算法执行过程中出栈的序列,而对于同一出栈序列,其入栈序列的个数为:

211n n n C +,每一种入栈序列对应一棵二叉树,所以,共有211

n

n

n C +棵二叉树。

3-40画出用5次比较将4个元素a,b,c,d排序的算法判定树。

答案

用5次比较将a、b、c、d四个元素进行排序的判定树如图3-28所示。

图3-28

*3-41画出求解12枚金币鉴别问题算法的判定树。用3次称量。

答案

所求判定树如图3-29所示:

图3-29

3.2.4 算法填空题

3-55函数creat用中序序列和后序序列构造二叉树。

设有定义:

typedef struct Bnode

{ int data;

struct Bnode *Lson, *Rson;

} Bnode, *Bptr;

主调语句为:root=creat(a,b,0,n-1,0,n-1);

Bptr creat(int a[ ],int b[ ],int i,int j,int s,int t)

//数组a[n]和b[n]分别存储二叉树的后序序列和中序序列

{ int k; Bptr p;

if (i>j)return ___(1)________;

p=(Bptr)malloc(sizeof(Bnode));

p->data=a[j];

k=s;

while ((_____(2)_____)&&(b[k]!=a[j])) ____(3)_______;

if(b[k]!=a[j])

{ printf("ERROR!\n");

exit(1);

}

___(4)_______=creat(a,b,i, _____(5)_______,s, _____(6)______); p->Rson=creat(a,b, ____(7)_______,j-1,k+1,t);

____(8)_______;

}

答案

(1)NULL (2)kLson

(5)i+k-s-1 (6)k-1 (7)i+k-s (8)return p

3-56函数creat用先序序列和后序序列构造正则二叉树。

类型定义如上题。

主调语句:root=creat(a,b,0,n-1,0,n-1);

Bptr creat(int a[ ],int b[ ],int i,int j,int s,int t)

//数组a[n]和b[n]分别存储二叉树的先序序列和后序序列

{ int k; Bptr p;

if (i>j)

{ printf("ERROR!\n");

exit(1);

}

p=(Bptr)malloc(sizeof(Bnode));

p->data=____(1)_______;

if(i= =j)

{ ____(2)_______________;

return p;

}

k=s;

while ((k

if(b[k]!=a[i+1])

{ printf("ERROR!\n");

exit(1);

}

p->Lson=creat (a,b,i+1, ____(4)_______,s,k);

p->Rson=creat (a,b, ____(5)_______,j,k+1, ____(6)___ );

return p;

}

答案

(1)a[i] (2)p->Lson=p->Rson=NULL (3)b[k]!=a[i+1] (4)i+k-s+1 (5)i+k-s+2 (6)t-1

3-57函数toot用于将根指针为root的二叉树输出成嵌套的括号形式,即形如:

根(左子树,右子树),其中,左右子树是递归的。

例如,若输出结果呈(■表示空结点):

1(2(3,■),4(■,5))

它所代表的树为:

1是根,2和4分别是1的左右儿子。

2的左儿子为3,右儿子是空。

4的左儿子为空,右儿子为5。

类型定义如上题。

主调语句为:toot(root);

void toot(Bptr p)

{ if(____(1)_______)

{ printf("■");

____(2)_______;

}

if(p->Lson==NULL&&p->Rson==NULL)

{ printf("%d",p->data);

return;

}

____(3)_______;

toot(p->Lson);

____(4)_______;

toot(p->Rson);

____(5)_______;

}

答案

(1)p==NULL (2)return (3)printf("%d(",p->data)

(4)printf(",") (5)printf(")")

3-58函数outa在二叉树中找值为a的结点(假定树中有且只有一个值为a的结点),分别输出:

(1)a 。

(2)a 的左子树上所有结点。 (3)a 的右子树上所有结点。 (4)a 的祖先。

例如,对于图3-40,若a=9,则输出结果为: The node: 9

Ltree of 9: 8 5 7

Rtree of 9: 12 10 18 15 13 17

ancesters of 9: 9 23

图3-40

//主调程序段 founda=0;

//整体量,初值为0

scanf("%d",&a); outa(root,a); printf("\n"); //函数

void outa(Bptr p, int a) { if(____(1)_______)return; if(founda==1)printf("%5d",p->data); if(____(2)_______) { founda=1;

printf(" The node: %d\n Ltree of %d: ",a,a); }

____(3)_______;

if(____(2)_______)printf("\n Rtree of %d: ",a);

____(4)_______;

if(____(2)_______)

{ founda=3;

printf("\n ancesters of %d: ",a);

}

if(____(5)_______)printf("%5d",p->data);

}

答案

(1)p==NULL||founda>2 (2)p->data==a (3)outa( p->Lson,a) (4)outa(p->Rson,a) (5)founda==3

3-59本算法输出一棵二叉树中结点a的所有最远子孙。

设根指针为Root,树中有且只有一个结点值等于a。算法由下面几段程序组成。int i,h,b; //定义整体量

void high(Bptr p)

{ if(p)

{ i++;

high(p->Lson);

high(p->Rson);

if(____(1)____)h=i;

____(2)____;

}

}

void wrt(Bptr p,int i )

{

if(p)

{ if(__(3)__) printf("%4d",p->data);

wrt(p->Lson,i+1);

wrt(p->Rson,i+1);

}

}

void find(Bptr p,int x )

{

if(__(4)__&&b)

if(p->data==x)

{ b=0; __(5)__; wrt( __(6)__ );}

else

{ find(p->Lson,x);

find(p->Rson,x);

}

}

//主函数

void main( )

{ …………;

构造以root为根的二叉树;输入元素a;

b=1; h=0; i=0;

find(root,a);

……;

}

答案

(1)h

树结构

第3章树结构 3.2 习题 3.2.1 填空题 3-1已知(L,N),(G,K),(G,L),(G,M),(B,E),(B,F),(D,G),(D,H),(D,I),(D,J),(A,B),(A,C),(A,D)是表示一棵树中具有父子关系的边,那么: (1)树的根、叶、非叶结点分别是__________。 (2)树的高度为______________。 (3)各个结点的度数分别是_____________。 (4)各个结点的层数分别是_____________。 (5)结点G的父亲、真祖先、儿子、真子孙、兄弟分别是__________。 3-2含3个结点的普通树的树形共有(1)____种,其树形分别为(2)__________。 3-3含3个结点的二叉树的树形共有(1)____种,其树形分别为(2)___________;其中有(3)____个是完全二叉树。 3-4图3-1中: 二叉树1的先序、中序、后序序列分别为:(1)_____________。 二叉树2的先序、中序、后序序列分别为:(2)_____________。 图3-1 3-5任何二叉树的叶结点在先序、中序和后序序列中的相对次序_____。 3-6由二叉树的先序序列和中序序列,求后序序列: 先序序列ABDGCEF,中序序列DGBAECF,后序序列是(1)___________。 先序序列ABEFGCD,中序序列BFEGADC,后序序列是(2)___________。 3-7由二叉树的后序序列和中序序列,求先序序列: 后序序列DBKHFEGCA,中序序列DBAKHEFCG,先序序列是(1)__________。

树结构习题及答案

第5章树 【例5-1】写出如图5-1所示的树的叶子结点、非终端结点、每个结点的度及树深度。 解: (1)叶子结点有:B 、D 、F 、G 、H 、I 、 J 。 (2)非终端结点有:A 、C 、E 。 (3)每个结点的度分别是:A 的度为4,C 的度为2,E 的度为3,其余结点的度为0。 (4)树的深度为3。 【例5-7】如图5-5所示的二叉树,要求: (1)写出按先序、中序、后序遍历得到的结点序列。 (2)画出该二叉树的后序线索二叉树。 解: (1) 先序遍历序列:ABDEFC 中序遍历序列:DEFBAC 后序遍历序列:FEDBCA b a c d e f 图5-5 A B C D E F G H I J 图5-4

(2)其后序线索二叉树如图5-6所示。 5%、、G 、H 的 3.假定一棵三叉树的结点数为50,则它的最小高度为(3.C )。 A.3 B.4 C.5 D.6 4.在一棵二叉树上第4层的结点数最多为(4.D )。 第六步: 25 30 9 9 18 7 12 8 15 27 43 图5-13

A.2 B.4 C.6 D.8 5.用顺序存储的方法将完全二叉树中的所有结点逐层存放在数组中R[1..n],结点R[i]若有左孩子,其左孩子的编号为结点(5.B)。 A.R[2i+1] B.R[2i] C.R[i/2] D.R[2i-1] 6.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为(6.D)。 A.24 B.48 C.72 D.53 7.线索二叉树是一种(7.C)结构。 A.逻辑 B.逻辑和存储 C.物理 D.线性 8.线索二叉树中,结点p没有左子树的充要条件是(8.B)。 A.p->lc=NULL B.p->ltag=1 C.p->ltag=1且p->lc=NULL D.以上都不对 9.设 10. A. 11. A. 12. A. B. C. D. 13. A. C. 14. A. 15. A. C. 1. 2. 3. 4. 5.由二叉树的先序序列和后序序列可以唯一确定一颗二叉树。(5.×) 6.树的后序遍历与其对应的二叉树的后序遍历序列相同。(6.√) 7.根据任意一种遍历序列即可唯一确定对应的二叉树。(7.√) 8.满二叉树也是完全二叉树。(8.√) 9.哈夫曼树一定是完全二叉树。(9.×) 10.树的子树是无序的。(10.×) 三、填空题 1.假定一棵树的广义表表示为A(B(E),C(F(H,I,J),G),D),则该树的度为_____,树的深度为_____,终端结点的个数为______,单分支结点的个数为______,双分支结点的个数为______,三分支结点的个数为_______,C结点的双亲结点为_______,其孩子结点为_______和_______结点。1.3,4,6,1,1,2,A,F,G

树的结构是怎样的

树的结构是怎样的 树从上到下主要分为四部分:树叶、树枝、树干、树根。 叶是植物合成营养物质的器官。叶子内含有叶绿体,是植物进行光合作用的主要器官。自然界中的氧气都是由植物的叶子产生的。同时,植物的蒸腾作用也是通过叶的气孔实现的。 根通常位于地表下面,负责吸收土壤里面的水分及溶解其中的离子,并且具有支持和贮存合成有机物质的作用。当然,位于地表外的气生根(榕树)也属于根的一种。 树干是植物的运输通道,一方面将由叶子产生的营养物质运输到根部或其他部位,它是在韧皮部中的管道中实现的。另一方面则是在木质部的管道中实现的,由下到上将根部吸收的水分和无机盐运送到叶部。 树枝也是植物的运输通道,此外它也有支持作用,让植物生长更多的叶子,以便产生适合其自身生长所需要的营养物质。 什么是年轮 一个年轮,代表着树木经历了所生长环境的一个周期的变化,通常气候是一年一个变化周期,所以年轮也就代表着一年中树木生长的情况。 根据年轮的数目,可以推知树木的年龄,用来考查森林的年代。不过,由于形成层有节奏的活动,有时在一年内也有可以产生几个年轮的,这叫假年轮。像柑属类植物,一年可产生3个年轮。所以,由年轮计算出来的树木年龄,只能是一个近似的数字。 年轮不仅可用来计算树木的年龄,从年轮的宽窄,还可以了解树木的经历以及树木与当时当地环境气候的关系。 在优越的气候条件下,树木生长得好,木质部增加得多,年轮也就较宽;反之年轮就窄。比如,树木最初的年轮一般比较宽,这表示那时它年轻力壮,生长力强;有时一棵树在出现了很多窄的年轮以后,突然出现有宽的年轮,这表明在年轮宽的那几年,环境气候适宜,对树木生长有利。 另外,还有偏心的年轮,那就说明树木两边环境不同,通常在北半球朝南的一面较朝北的一面温暖,所以朝南的一面年轮较宽。 通过对年轮变化规律的研究和对它所在地区气候的了解,对制定超长期气象预报及制定造林规划等方面,都有指导意义。

树的四种分类

Search trees:实例--二叉搜索树 什么是二叉搜索树 二叉搜索树(Binary Search Tree)是一棵有序的二叉树,所以我们也可以称它为二叉排序树(不知道二叉树的童鞋,先看看二叉树:传送门)。 具有以下性质的二叉树我们称之为二叉搜索树:若它的左子树不为空,那么左子树上的所有值均小于它的根节点;若它的右子树不为空,那么右子树上所有值均大于它的根节点。它的左子树和右子树分别也为二叉搜索树。 2、二叉搜索树的结构 二叉搜索树能够高效的进行一下操作:①插入一个数值②查询是否包含某个数值③删除某个数值 根据实现的不同,还可以实现其他各种操作,这是一种使用性很高的数据结构。我们来看一个例子: 这就是二叉搜索树的存储结构,所有的节点,都满足左子树上的比自己小,而右子树上的所有节点比自己大。二叉搜索树因为其有序性,所以它能够高效的管理数的集合 (1)查询 我们查找是否存在17: <1>根节点是7,因为小于17,所以去右子树查找 <2>走到节点12,还是小于17,所以继续往右子树找 <3>走到节点17,此时找到17。 (2)插入

我们使用查找的方式进行插入,以数字6为例,如图所示: (3)删除 删除操作相对之前的其他两种操作,就略显复杂一些。一般来说我们可以分为三种情况: <1>需要删除的节点没有左儿子,那么就把右儿子提上去 <2>需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去 <3>不满足上述的两种情况的话,就把左子树中最大的节点放到要删除的节点上。 3、二叉搜索树的复杂度 无论我们执行哪一个操作,其所花的时间都和树的高度成正比。我们不难得知,二叉搜索树的平均复杂度为O(log n)。

.结构树

结构树(Structure Tree) 描述结构树用于系统地: ●把主题或问题领域(例如:沟通不畅、周转时间、降低存货等等) 分割成更细小、更易处理的问题。 ●或者 ●发现可能导致问题产生的一个或几个根本原因。 尽管结构树和鱼骨图(因果图)可以相互替代使用(即作为第一部 和第二步的工具),但是熟练的问题解决专家建议第一步使用结构树 而在第二步使用鱼骨图,这样有助于参与者认清自己处在问题解决 程序中的哪个位置并且避免引起混淆。 主要用途步骤对用途的描述 第一步-任务2 找出与主题相关的问题 第一步-任务3 选择目标问题 第二步-任务1 决定采集什么数据 第二步-任务2 采集数据 第二步-任务3 整理及演示数据 第二步-任务4 认别原因 程序由于结构树既可以用于第一步又可以用于第二步,并且在每个步骤的使用中存在一些差别,所以我们先对划分主题或问题领域进行描 述,然后再对发现根本原因进行描述。

划分主题或问题领域1.在一块演示板或活动挂图(或者你也可以使用一个带有卡片、 大头针和线/带子的概要串联图)左下角的方框里填入第一步-任务1里的主题。 2.从方框画出一条水平线,并与一条长的垂直线相连。从垂直线 上画出几条水平线,代表与主体相关的主要问题领域。 顾客 满意度 问题是? 主题

结构树(Structure Tree) 程序 3. 把主题细分为几个问题领域。 (续) 划分主通过提问下面的基本问题,把主体划分为问题领域: 题或问 题领域 在把主体划分为问题领域时,在垂直线的上方写上一个问题:“问 题是?”可以有助于提醒你。小组可以提出来帮助回答这个基本问 题——“问题是什么?”的提问包括: ●“你们面临的问题来自哪儿?” ●“具体来讲是哪个(小组、功能部门、产品、地理区域,等等)?” ●“你所说的…..是指什么?” ●“我们对哪些领域感到不满意?” 这些问题的答案通常提示了进一步细分的分类标准(即按照产品类 型、区域、功能、小组、体系、报告类型、部分等等来细分)。 注意:如果你知道你想关注的是什么具体问题领域,那么第一步的 细分工作(即第三步)就不是必需的了。例如,在“顾客满意度的 例子中,如果你知道“产品交付”是“顾客满意度”这个主题的主 要问题领域,你可以这样开始绘制你的结构树:

1.结构树

描述结构树用于系统地: ●把主题或问题领域(例如:沟通不畅、周转时间、降低存货等等) 分割成更细小、更易处理的问题。 或者 ●发现可能导致问题产生的一个或几个根本原因。 尽管结构树和鱼骨图(因果图)可以相互替代使用(即作为第一部 和第二步的工具),但是熟练的问题解决专家建议第一步使用结构树 而在第二步使用鱼骨图,这样有助于参与者认清自己处在问题解决 程序中的哪个位置并且避免引起混淆。 主要用途步骤对用途的描述 第一步-任务2 找出与主题相关的问题 第一步-任务3 选择目标问题 第二步-任务1 决定采集什么数据 第二步-任务2 采集数据 第二步-任务3 整理及演示数据 第二步-任务4 认别原因 程序由于结构树既可以用于第一步又可以用于第二步,并且在每个步骤的使用中存在一些差别,所以我们先对划分主题或问题领域进行描 述,然后再对发现根本原因进行描述。 划分主题或问题领域1.在一块演示板或活动挂图(或者你也可以使用一个带有卡片、 大头针和线/带子的概要串联图)左下角的方框里填入第一步-任务1里的主题。 2.从方框画出一条水平线,并与一条长的垂直线相连。从垂直线 上画出几条水平线,代表与主体相关的主要问题领域。 顾客 满意度 问题是? 主题 问题领域

程序 3. 把主题细分为几个问题领域。 (续) 划分主 通过提问下面的基本问题,把主体划分为问题领域: 题或问 题领域 在把主体划分为问题领域时,在垂直线的上方写上一个问题:“问题是?”可以有助于提醒你。小组可以提出来帮助回答这个基本问题——“问题是什么?”的提问包括: ● “你们面临的问题来自哪儿?” ● “具体来讲是哪个(小组、功能部门、产品、地理区域,等等)?” ● “你所说的…..是指什么?” ● “我们对哪些领域感到不满意?” 这些问题的答案通常提示了进一步细分的分类标准(即按照产品类型、区域、功能、小组、体系、报告类型、部分等等来细分)。 注意:如果你知道你想关注的是什么具体问题领域,那么第一步的细分工作(即第三步)就不是必需的了。例如,在“顾客满意度的例子中,如果你知道“产品交付”是“顾客满意度”这个主题的主要问题领域,你可以这样开始绘制你的结构树: 产品 交付 顾客满意度 问题是? 主题 问题领域

数据结构第三章 树 答案

数据结构与算法上机作业第三章树

一、选择题 1、在一棵树中,如果结点A有3个兄弟,B是A的双亲,则B的度为 D A. 1 B. 2 C. 3 D. 4 2、深度为h的完全二叉树至少有 D 个结点,至多有 B 个结点 A. 2h B. 2h-1 C. 2h+1 D. 2h-1 3、具有n个结点的满二叉树有 C 个叶结点。 A. n/2 B. (n-1)/2 C. (n+1)/2 D. n/2+1 4、一棵具有25个叶结点的完全二叉树最多有 C 个结点。 A. 48 B. 49 C. 50 D. 51 5、已知二叉树的先根遍历序列是ABCDEF,中根遍历序列是CBAEDF,则后根遍历序列 是 A 。 A. CBEFDA B. FEDCBA C. CBEDFA D. 不定 6、具有10个叶结点的二叉树中有 B 个度为2的结点。 A. 8 B. 9 C. 10 D. 11 7、一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满 足 C 。 A. 所有非叶结点均无左孩子 B. 所有非叶结点均无右孩子 C. 只有一个叶子结点 D. A和B同时成立 8、在线索二叉树中,t所指结点没有左子树的充要条件是 B 。 A. t->left=NULL B. t->ltag=TRUE C. t->ltag=TRUE且t->left=NULL D. 以上都不对 9、n个结点的线索二叉树上含有的线索数为 C 。 A. 2n B. n-1 C. n+1 D. n 10、二叉树按照某种顺序线索化后,任一结点都有指向其前驱和后继的线索,这种说法 B 。 A. 正确 B. 错误 C. 不确定 D. 都有可能 11、具有n(n>1)个结点的完全二叉树中,结点i(2i>n)的左孩子结点是 D 。 A. 2i B. 2i+1 C. 2i-1 D. 不存在 12、具有64个结点的完全二叉树的深度为 C 。 A. 5 B. 6 C.7 D. 8 13、将一颗有100个结点的完全二叉树从上到下、从左到右一次对结点进行编号,根结点的编号为1,则编号为45的结点的右孩子的编号为 D 。 A. 46 B. 47 C. 90 D. 91 14、在结点数为n的堆中插入一个结点时,复杂度为 C 。 A. O(n) B. O(n2) C. O(log2n) D. O(log n2) 15、两个二叉树是等价的,则它们满足 D 。 A. 它们都为空 B. 它们的左右子树都具有相同的结构 C. 它们对应的结点包含相同的信息 D. A、B和C 16、包含n个元素的堆的高度为 C 。(符号「a表示取不小a最小整数) A. n B. 「log2n C. 「log2(n+1) D. n+1 17、以下说法错误的是 B 。 A. 存在这样的二叉树,对其采用任何次序的遍历其结点访问序列均相同 B. 二叉树是树的特殊情形

树的结构

树的结构 树的定义 树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。我们可以形式地给出树的递归定义如下: 1.单个结点是一棵树,树根就是该结点本身。 2.设T1,T2,..,T k是树,它们的根结点分别为n1,n2,..,n k。用一个新结点n作为n1,n2,..,n k 的父亲,则得到一棵新树,结点n就是新树的根。我们称n1,n2,..,n k为一组兄弟结点,它们都是结点n的儿子结点。我们还称n1,n2,..,n k为结点n的子树。 空集合也是树,称为空树。空树中没有结点。 一棵典型的树如图1所示: 图1 树的层次结构 由图1可以看出树的形状就像一棵现实中的树,只不过是倒过来的。 树的相关术语 1. 一个结点的儿子结点的个数称为该结点的度。一棵树的度是指该树中结点 的最大度数。 2. 树中度为零的结点称为叶结点或终端结点。

3. 树中度不为零的结点称为分枝结点或非终端结点。除根结点外的分枝结点统称为内部结点。 例如在图1中,结点A,B和E的度分别为3,2,0。其中A为根结点,B为内部结点,E为叶结点,树的度为3。 4. 如果存在树中的一个结点序列K1,K2,..,K j,使得结点K i是结点K i+1的父结点(1≤i≤j),则称该结点序列是树中从结点K1到结点K j的一条路径或道路。我们称这条路径的长度为j-1,它是该路径所经过的边(即连接两个结点的线段)的数目。树中任一结点有一条到其自身的长度为零的路径。 例如,在图1中,结点A到结点I有一条路径ABFI,它的长度为3。 5. 如果在树中存在一条从结点K到结点M的路径,则称结点K是结点M的祖先,也称结点M是结点K的子孙或后裔。 例如在图1中,结点F的祖先有A,B和F自己,而它的子孙包括它自己和I,J。注意,任一结点既是它自己的祖先也是它自己的子孙。 6. 我们将树中一个结点的非自身祖先和子孙分别称为该结点的真祖先和真子孙。在一棵树中,树根是唯一没有真祖先的结点。叶结点是那些没有真子孙的结点。子树是树中某一结点及其所有真子孙组成的一棵树。 7. 树中一个结点的高度是指从该结点到作为它的子孙的各叶结点的最长路径的长度。树的高度是指根结点的高度。 例如图1中的结点B,C和D的高度分别为2,0和1,而树的高度与结点A 的高度相同为3。 8. 从树根到任一结点n有唯一的一条路径,我们称这条路径的长度为结点n 的深度或层数。根结点的深度为0,其余结点的深度为其父结点的深度加1。深度相同的结点属于同一层。 例如,在图1中,结点A的深度为0;结点B,C和D的深度为1;结点E,F,G,H的深度为2;结点I和J的深度为3。在树的第二层的结点有E,F,J和H,树的第0层只有一个根结点A。 9. 树的定义在某些结点之间确定了父子关系,我们又将这种关系延拓为祖先子孙关系。但是树中的许多结点之间仍然没有这种关系。例如兄弟结点之间就没有祖先子孙关系。如果我们在树的每一组兄弟结点之间定义一个从左到右的次序,则得到一棵有序树;否则称为无序树。设结点n的所有儿子按其从左到右的次序排列为n1,n2,..,n k,则我们称n1是n的最左儿子,或简称左儿子,并称n i是n i-1的右邻兄弟,或简称右兄弟(i=2,3,..k)。 图2中的两棵树作为无序树是相同的,但作为有序树是不同的,因为结点a的两个儿子在两棵树中的左右次序是不同的。后面,我们只关心有序树,因为无序树总可能转化为有序树加以研究。

树结构及其应用

中南大学 数据结构实验报告 题目:树结构及其应用学生姓名:张雨欣 学号:0902150323 指导老师:余腊生 学院:信息科学与工程学院专业班级:计科工试1501班 完成时间:2016年12月27日指导老师评定:签名:

需求分析 二叉树的建立与遍历(验证性实验) 问题描述: 建立一棵二叉树,并对其进行遍历(先序,中序和后序),打印输出遍历结果 基本要求: 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序,中序和后序),将遍历结果打印输出。 测试数据: AB.CE..G.D.F.H..则输出结果为:先序为ABCEGDFH,中序为BECGADFH,后序为EGCBHFDA 源程序 #include #include #include typedef int DataType; typedef struct Node { DataType data; struct Node *LChild; struct Node *RChild; }BitNode,*BitTree; void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点// {

char ch; ch=getchar(); if(ch=='.')*bt=NULL; else { *bt=(BitTree)malloc(sizeof(BitNode)); (*bt)->data=ch; CreatBiTree(&((*bt)->LChild)); CreatBiTree(&((*bt)->RChild)); } } void Visit(char ch)//访问根节点 { printf("%c ",ch); } void PreOrder(BitTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { Visit(root ->data); /*访问根结点*/ PreOrder(root ->LChild); /*先序遍历左子树*/ PreOrder(root ->RChild); /*先序遍历右子树*/ } } void InOrder(BitTree root) /*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { InOrder(root ->LChild); /*中序遍历左子树*/ Visit(root ->data); /*访问根结点*/ InOrder(root ->RChild); /*中序遍历右子树*/ } } void PostOrder(BitTree root) /* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ { if(root!=NULL) { PostOrder(root ->LChild); /*后序遍历左子树*/ PostOrder(root ->RChild); /*后序遍历右子树*/ Visit(root ->data); /*访问根结点*/ }

树是一种重要的线性结构

树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。 一、树的概述 树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。以下具体地给出树的定义及树的数据结构表示。 (一)树的定义 树是由一个或多个结点组成的有限集合,其中: ⒈必有一个特定的称为根(ROOT)的结点; ⒉剩下的结点被分成n>=0个互不相交的集合T1、T2、......Tn,而且,这些集合的每一 个又都是树。树T1、T2、......Tn被称作根的子树(Subtree)。 树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不相交的子树 1.树的度——也即是宽度,简单地说,就是结点的分支数。以组成该树各结点中最大的度作为该树的度,如上图的树,其度为3;树中度为零的结点称为叶结点或终端结点。树中度不为零的结点称为分枝结点或非终端结点。除根结点外的分枝结点统称为内部结点。 2.树的深度——组成该树各结点的最大层次,如上图,其深度为4; 3.森林——指若干棵互不相交的树的集合,如上图,去掉根结点A,其原来的二棵子树T1、 T2、T3的集合{T1,T2,T3}就为森林; 4.有序树——指树中同层结点从左到右有次序排列,它们之间的次序不能互换,这样的树称 为有序树,否则称为无序树。 5.树的表示 树的表示方法有许多,常用的方法是用括号:先将根结点放入一对圆括号中,然后把它的子树由左至右的顺序放入括号中,而对子树也采用同样的方法处理;同层子树与它的根结点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。如上图可写成如下形式: (A(B(E(K,L),F),C(G),D(H(M),I,J))) 5. 2 二叉树 1.二叉树的基本形态: 二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全二叉树——(e) 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。

树形组织结构图

树形组织结构图(转载) 2008-04-06 20:35 第一、组织结构预览如下图: 第二、功能说明: 当鼠标点击左边某组织时,会把该组织下的所有成员添加到右边(排重);当鼠标点击左边某成员时,会把该成员添加到右边(排重); 当鼠标点击"全选"时,会把所有组织的成员添加到右边(排重); 当鼠标点击"移除"时,会把右侧被选中的成员移除; 第三、java script代码实现如下: //添加成员 function addUser(id, name) { var oOption = document.createElement("OPTION"); oOption.text = name; oOption.value = id; var oSelect = window.parent.document.getElementById("groupdest"); if (!checkById(id, name)) { oSelect.add(oOption); } } //添加组织 function addGroup(id, ids, names) { if (ids == "") {

return; } var idArr = ids.split(","); var nameArr = names.split(","); var len = idArr.length; for (var i = 0; i < len - 1; i ++) { addUser(idArr[i], nameArr[i]); } } //检查是否已经添加过 function checkById(id, name) { var oSelect = window.parent.document.getElementById("groupdest"); var bContains = false; for (var i = 0; i < oSelect.length; i++) { if (oSelect.options[i].value == id || oSelect.options[i].text == name) { bContains = true; } } return bContains; } //移除用户 function removeUser() { var oSelect = document.getElementById("groupdest"); for (var i = 0; i < oSelect.length; i++) { var option = oSelect.options[i]; if (option.selected == true) { oSelect.remove(i); return; } } } 第四:树状组织结构图的MzTreeView-1.0动态实现的Table /** * */ package com.daniel.lr.crbt.share.db; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; import org.hibernate.validator.Pattern; /** * @author Daniel Cao * @date 2007-4-27 * @time 下午10:47:59

树结构概述

#树结构概述 文章目录 什么是树结构? 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样 简介 树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述 比如下图就是一颗树结构,这张图倒过来看就会跟树一样 为什么要使用树结构? ?查找性能好- 插入性能好 # 树的基本概念 根节点 这一个就是树的一个根节点,看树结构的时候一般都是从上往下看的 双亲节点 比如这样一幅图,A 是 C 和 D 的双亲节点,C 和 D 是 A 的子节点。同样地,B 是 E 和 F 的双亲节点,E 和 F 是 B 的子节点,下面的也是一样,以此类推 路径 比如说我们查找 C 的话,那路径就是 A ——> B ——> C 节点的度 节点的度就是说看下这个节点有多少个子节点或者说子树,对于一个节点有多少个子节点我们就认为它的度是多少在这幅图中 - 对于 C 来说的话它的度就是 0,因为它没有子节点- 对于 A 节点来说它的度就是 3,因为 A 节点有三个子节点,分别

是 B C D- 对于 B 节点来说它的度就是 2,因为 B 节点有两个子节点,分别是 E F- 对于 D 节点来说它的度也是 2,因为 D 节点有两个子节点,分别是 G H 以此类推 节点的权 节点的权指的是我们往这个节点上面赋予的数值内容,简单地说就是这个节点里面存的数字比如黄色框住的权是1,蓝色框住的权是2,灰色框住的权是3 叶子节点 叶子节点就是没有子节点的节点比如这幅图,圈出来的都是叶子节点,因为他们没有子节点。就好比树的叶子一样,叶子怎么长出叶子呢对吧 子树 比如这幅图,把黄色一块单独拿出来也可以作为一棵树,但是这黄色部分这棵树本身是在这一整棵树里边的,所以称为子树 层 比如这幅图里边的树就可以划分为四层 树的高度 树的高度也就是树的最大层数 森林 比如我们把上面图中的树拆分,如下图所示拆分之后就变成三棵树了,那么这三棵树就可以称为森林

相关主题