数据结构第六章树和二叉树课件

上传人:hs****ma 文档编号:570512892 上传时间:2024-08-04 格式:PPT 页数:119 大小:1.68MB
返回 下载 相关 举报
数据结构第六章树和二叉树课件_第1页
第1页 / 共119页
数据结构第六章树和二叉树课件_第2页
第2页 / 共119页
数据结构第六章树和二叉树课件_第3页
第3页 / 共119页
数据结构第六章树和二叉树课件_第4页
第4页 / 共119页
数据结构第六章树和二叉树课件_第5页
第5页 / 共119页
点击查看更多>>
资源描述

《数据结构第六章树和二叉树课件》由会员分享,可在线阅读,更多相关《数据结构第六章树和二叉树课件(119页珍藏版)》请在金锄头文库上搜索。

1、6.1 树的定义和基本术语树的定义和基本术语6.2 6.2 6.2 6.2 二叉树二叉树二叉树二叉树6.3 遍历二叉树和线索二叉树遍历二叉树和线索二叉树6.4 树和森林树和森林6.6 哈夫曼树及其应用哈夫曼树及其应用作业作业实验实验6.1 树的定义和基本术语树的定义和基本术语结点结点结点结点: : : :结点的度结点的度结点的度结点的度: : : :树的度树的度树的度树的度: : : :叶子结点叶子结点叶子结点叶子结点: : : :分支结点分支结点分支结点分支结点: : : :数据元素数据元素数据元素数据元素+ + + +若干指向子树的分支若干指向子树的分支若干指向子树的分支若干指向子树的分支

2、分支的个数分支的个数分支的个数分支的个数树中所有结点的度的最大值树中所有结点的度的最大值树中所有结点的度的最大值树中所有结点的度的最大值度为零的结点度为零的结点度为零的结点度为零的结点度大于零的结点度大于零的结点度大于零的结点度大于零的结点D DH HI IJ JMM( ( ( (从根到结点的从根到结点的从根到结点的从根到结点的) ) ) )路径:路径:路径:路径:孩子孩子孩子孩子结点结点结点结点、双亲双亲双亲双亲结点结点结点结点兄弟兄弟兄弟兄弟结点结点结点结点、堂兄弟堂兄弟堂兄弟堂兄弟祖先祖先祖先祖先结点结点结点结点、子孙子孙子孙子孙结点结点结点结点 由从根到该结点所经分支和结点构成由从根到

3、该结点所经分支和结点构成由从根到该结点所经分支和结点构成由从根到该结点所经分支和结点构成ABCDEFGHIJMKL结点的层次结点的层次结点的层次结点的层次: : : :树的深度:树的深度:树的深度:树的深度:假设根结点的层次为假设根结点的层次为假设根结点的层次为假设根结点的层次为1 1 1 1,第,第,第,第l l 层的结点层的结点层的结点层的结点的子树根结点的层次为的子树根结点的层次为的子树根结点的层次为的子树根结点的层次为l+1l+1树中叶子结点所在的最大层次树中叶子结点所在的最大层次树中叶子结点所在的最大层次树中叶子结点所在的最大层次ABCDEFGHIJMKL森林:森林:是m(m0)棵互

4、不相交的树的集合BEFKLACGDHIJMABCDEFGHIJMKLA( B(E, F(K, L), C(G), D(H, I, J(M) )T1T3T2树根例如例如: :( () ) 有确定的根;有确定的根;有确定的根;有确定的根;( () ) 树根和子树根之间为有向关系。树根和子树根之间为有向关系。树根和子树根之间为有向关系。树根和子树根之间为有向关系。有向树:有向树:有向树:有向树:有序树:有序树:有序树:有序树:子树之间存在确定的次序关系。子树之间存在确定的次序关系。子树之间存在确定的次序关系。子树之间存在确定的次序关系。无序树:无序树:无序树:无序树:子树之间不存在确定的次序关系。子

5、树之间不存在确定的次序关系。子树之间不存在确定的次序关系。子树之间不存在确定的次序关系。BEFKL对比对比树型结构树型结构和和线性结构线性结构的结构特点的结构特点线性结构线性结构线性结构线性结构树型结构树型结构树型结构树型结构第一个数据元素第一个数据元素第一个数据元素第一个数据元素 ( ( ( (无前驱无前驱无前驱无前驱) ) ) ) 根结点根结点根结点根结点 ( ( ( (无前驱无前驱无前驱无前驱) ) ) )最后一个数据元素最后一个数据元素最后一个数据元素最后一个数据元素 ( (无后继无后继无后继无后继) )多个叶子结点多个叶子结点多个叶子结点多个叶子结点 ( ( ( (无后继无后继无后继

6、无后继) ) ) )其它数据元素其它数据元素其它数据元素其它数据元素( ( ( (一个前驱、一个前驱、一个前驱、一个前驱、 一个后继一个后继一个后继一个后继) ) ) )其它数据元素其它数据元素其它数据元素其它数据元素( ( ( (一个前驱、一个前驱、一个前驱、一个前驱、 多个后继多个后继多个后继多个后继) ) ) ) 而现实中的许多事物的关系并非这样简单,而现实中的许多事物的关系并非这样简单,而现实中的许多事物的关系并非这样简单,而现实中的许多事物的关系并非这样简单,如人类社会的族谱、各种社会组织机构以及城市如人类社会的族谱、各种社会组织机构以及城市如人类社会的族谱、各种社会组织机构以及城市

7、如人类社会的族谱、各种社会组织机构以及城市交通、通讯等,这些事物中的联系都是非线性的,交通、通讯等,这些事物中的联系都是非线性的,交通、通讯等,这些事物中的联系都是非线性的,交通、通讯等,这些事物中的联系都是非线性的,采用非线性结构进行描绘会更明确和便利。采用非线性结构进行描绘会更明确和便利。采用非线性结构进行描绘会更明确和便利。采用非线性结构进行描绘会更明确和便利。 在前面几章里讨论的数据结构都属于线性结构在前面几章里讨论的数据结构都属于线性结构在前面几章里讨论的数据结构都属于线性结构在前面几章里讨论的数据结构都属于线性结构 线性结构的特点是逻辑结构简单,易于进行线性结构的特点是逻辑结构简单

8、,易于进行线性结构的特点是逻辑结构简单,易于进行线性结构的特点是逻辑结构简单,易于进行查找、插入和删除等操作查找、插入和删除等操作查找、插入和删除等操作查找、插入和删除等操作 其主要用于对客观世界中具有单一的前驱和其主要用于对客观世界中具有单一的前驱和其主要用于对客观世界中具有单一的前驱和其主要用于对客观世界中具有单一的前驱和后继的数据关系进行描述后继的数据关系进行描述后继的数据关系进行描述后继的数据关系进行描述 所谓非线性结构是指,在该结构中至少存在所谓非线性结构是指,在该结构中至少存在所谓非线性结构是指,在该结构中至少存在所谓非线性结构是指,在该结构中至少存在一个数据元素,有两个或两个以上

9、的直接前驱一个数据元素,有两个或两个以上的直接前驱一个数据元素,有两个或两个以上的直接前驱一个数据元素,有两个或两个以上的直接前驱(或直接后继)元素。(或直接后继)元素。(或直接后继)元素。(或直接后继)元素。 树型结构和图型就是其中十分重要的非线性树型结构和图型就是其中十分重要的非线性树型结构和图型就是其中十分重要的非线性树型结构和图型就是其中十分重要的非线性结构,可以用来描述客观世界中广泛存在的层次结构,可以用来描述客观世界中广泛存在的层次结构,可以用来描述客观世界中广泛存在的层次结构,可以用来描述客观世界中广泛存在的层次结构和网状结构的关系,如前面提到的族谱、结构和网状结构的关系,如前面

10、提到的族谱、结构和网状结构的关系,如前面提到的族谱、结构和网状结构的关系,如前面提到的族谱、城市交通等。城市交通等。城市交通等。城市交通等。 本章对树型结构中最简单、应用十分广泛本章对树型结构中最简单、应用十分广泛本章对树型结构中最简单、应用十分广泛本章对树型结构中最简单、应用十分广泛的的的的二叉树二叉树二叉树二叉树结构进行讨论。结构进行讨论。结构进行讨论。结构进行讨论。 二叉树或为空树,或是由一个根结点加上二叉树或为空树,或是由一个根结点加上二叉树或为空树,或是由一个根结点加上二叉树或为空树,或是由一个根结点加上 两棵分别称为两棵分别称为两棵分别称为两棵分别称为左子树左子树左子树左子树和和和

11、和右子树右子树右子树右子树的、的、的、的、互不交的互不交的互不交的互不交的二叉树组成。二叉树组成。二叉树组成。二叉树组成。ABCDEFGHK根结点左子树左子树左子树左子树右子树右子树右子树右子树6.2 二叉树二叉树6.2.1 6.2.1 二叉树的定义二叉树的定义二叉树的定义二叉树的定义二叉树的五种基本形态:二叉树的五种基本形态:N空树空树只含根结点只含根结点NNNLRR右子树为空树右子树为空树L左子树为空树左子树为空树左右子树左右子树均不为空均不为空树树 二叉树的主要基本操作:二叉树的主要基本操作:二叉树的主要基本操作:二叉树的主要基本操作:查查 找找 插插 入入 删删 除除 性性质质 1 :

12、 在二叉树的第 i 层上至多有2i-1 个结点。 (i1)用归纳法证明用归纳法证明: 归纳基归纳基: 归纳假设:归纳假设: 归纳证明:归纳证明:i = 1 层时,只有一个根结点: 2i-1 = 20 = 1;假设对所有的 j,1 j i,命题成立;二叉树上每个结点至多有两棵子树,则第 i 层的结点数 = 2i-2 2 = 2i-1 。6.2.2 6.2.2 二叉树的性质二叉树的性质二叉树的性质二叉树的性质性质性质 2 : 深度为 k 的二叉树上至多含 2k-1 个结点(k1)。证明:证明: 基于上一条性质,深度为 k 的二叉树上的结点数至多为 20+21+ +2k-1 = 2k-1 。 性质性

13、质 3 : 对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1。证明:证明:设设 二叉树上结点总数 n = n0 + n1 + n2又又 二叉树上分支总数 b = n1+2n2 而 b = n-1 = n0 + n1 + n2 - 1由此,由此, n0 = n2 + 1 。两类两类两类两类特殊特殊特殊特殊的二叉树:的二叉树:的二叉树:的二叉树:满二叉树:满二叉树:满二叉树:满二叉树:指的是深度为指的是深度为指的是深度为指的是深度为k k且含有且含有且含有且含有2 2k k-1-1个结点的二叉树。个结点的二叉树。个结点的二叉树。个结点的二叉树

14、。完全二叉树完全二叉树完全二叉树完全二叉树:树中所含树中所含树中所含树中所含的的的的 n n 个结点和满二叉树个结点和满二叉树个结点和满二叉树个结点和满二叉树中中中中编号为编号为编号为编号为 1 1 至至至至 n n 的结点的结点的结点的结点一一对应。一一对应。一一对应。一一对应。123456789 10 11 12 13 14 15abcdefghij 性性质质 4 : 具有 n 个结点的完全二叉树的深深度度为 log2n +1 。证明:证明:设设完全二叉树的深度为 k 则根据第二条性质得 2k-1 n 2k 即 k-1 log2 n n,则该结点无左孩子, 否则,编号为 2i 的结点为其左

15、孩子左孩子结点;(3) 若 2i+1n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子右孩子结点。2.2.2.2.二叉树的链式存储表示二叉树的链式存储表示二叉树的链式存储表示二叉树的链式存储表示1. 1. 二叉树的顺序存储表示二叉树的顺序存储表示二叉树的顺序存储表示二叉树的顺序存储表示6.2.3 二叉树的存储结构二叉树的存储结构#define MAX_TREE_SIZE 100 #define MAX_TREE_SIZE 100 / / 二叉树的最大结点数二叉树的最大结点数二叉树的最大结点数二叉树的最大结点数typedeftypedef TElemTypeTElemType S

16、qBiTreeMAXSqBiTreeMAX_ _ TREE_SIZE; TREE_SIZE; / 0 / 0号单元存储根结点号单元存储根结点号单元存储根结点号单元存储根结点SqBiTreeSqBiTree btbt; ;1. 二叉树的顺序存储表示二叉树的顺序存储表示 例如例如:ABCDEF A B D C E F 0 1 2 3 4 5 6 7 8 9 10 11 12 1314013262 2、二叉树的链式存储表示、二叉树的链式存储表示(1 1 1 1) 二叉链表二叉链表二叉链表二叉链表(2 2)三叉链表三叉链表三叉链表三叉链表ADEBCF rootlchild data rchild结点结

17、构结点结构:(1 1 1 1) 二叉链表二叉链表二叉链表二叉链表typedeftypedef structstruct BiTNodeBiTNode / / 结点结构结点结构结点结构结点结构 TElemTypeTElemType data; data; structstruct BiTNodeBiTNode * *lchildlchild, *, *rchildrchild; ; / / 左右孩子指针左右孩子指针左右孩子指针左右孩子指针 BiTNodeBiTNode, *, *BiTreeBiTree; ;lchild data rchild结点结构结点结构:C C 语言的类型描述如下语言的类

18、型描述如下语言的类型描述如下语言的类型描述如下: : : :ADEBCF root (2)三叉链表三叉链表parent lchild data rchild结点结构结点结构: typedeftypedef structstruct TriTNodeTriTNode / / 结点结构结点结构结点结构结点结构 TElemTypeTElemType data; data; structstruct TriTNodeTriTNode * *lchildlchild, *, *rchildrchild; ; / / 左右孩子指针左右孩子指针左右孩子指针左右孩子指针 structstruct TriTNo

19、deTriTNode *parent*parent; /; /双亲指针双亲指针双亲指针双亲指针 TriTNodeTriTNode, *, *TriTreeTriTree; ;parent lchild data rchild结点结构结点结构:C C 语言的类型描述如下语言的类型描述如下语言的类型描述如下语言的类型描述如下: : : :6.3 遍历二叉树和线索二叉树遍历二叉树和线索二叉树一、一、一、一、问题的提出问题的提出问题的提出问题的提出二、二、二、二、先左后右的遍历算法先左后右的遍历算法先左后右的遍历算法先左后右的遍历算法三、三、三、三、算法的递归描述算法的递归描述算法的递归描述算法的递归

20、描述四、四、四、四、中序遍历算法的非递归描述中序遍历算法的非递归描述中序遍历算法的非递归描述中序遍历算法的非递归描述五、五、五、五、遍历算法的应用举例遍历算法的应用举例遍历算法的应用举例遍历算法的应用举例(对教材的补充)(对教材的补充)(对教材的补充)(对教材的补充)6.3.1 6.3.1 遍历二叉树遍历二叉树遍历二叉树遍历二叉树 顺着某一条搜索路径顺着某一条搜索路径顺着某一条搜索路径顺着某一条搜索路径巡访巡访巡访巡访二叉树二叉树二叉树二叉树中的结点,使得每个结点中的结点,使得每个结点中的结点,使得每个结点中的结点,使得每个结点均被访问一均被访问一均被访问一均被访问一次次次次,而且,而且,而且

21、,而且仅被访问一次仅被访问一次仅被访问一次仅被访问一次。一、问题的提出一、问题的提出一、问题的提出一、问题的提出“ “访问访问访问访问” ”的含义可以很广,如:输出结的含义可以很广,如:输出结的含义可以很广,如:输出结的含义可以很广,如:输出结点的信息等。点的信息等。点的信息等。点的信息等。 “ “遍历遍历遍历遍历” ”是任何类型均有的操作,是任何类型均有的操作,是任何类型均有的操作,是任何类型均有的操作,对线性结构而言,只有一条搜索路对线性结构而言,只有一条搜索路对线性结构而言,只有一条搜索路对线性结构而言,只有一条搜索路径径径径( (因为每个结点均只有一个后继因为每个结点均只有一个后继因为

22、每个结点均只有一个后继因为每个结点均只有一个后继) ),故不需要另加讨论。故不需要另加讨论。故不需要另加讨论。故不需要另加讨论。 而二叉树是非线性结构,每个结点而二叉树是非线性结构,每个结点而二叉树是非线性结构,每个结点而二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么有两个后继,则存在如何遍历即按什么有两个后继,则存在如何遍历即按什么有两个后继,则存在如何遍历即按什么样的样的样的样的搜索路径搜索路径搜索路径搜索路径遍历的问题。遍历的问题。遍历的问题。遍历的问题。 对对“二二叉叉树树”而而言言,可可以以有三条搜索路径:有三条搜索路径:1先上后下先上后下的按层次遍历;2先先左左(子

23、树)后后右右(子树)的遍历;3先先右右(子树)后后左左(子树)的遍历。二、先左后右的遍历算法二、先左后右的遍历算法先先(根)序的遍历算法中中(根)序的遍历算法后后(根)序的遍历算法 若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。先(根)序的遍历算法:先(根)序的遍历算法: 若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。中(根)序的遍历算法:中(根)序的遍历算法: 若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。后(根)序的遍历算法:后(根)序的遍历算法:

24、三、算法的递归描述三、算法的递归描述void Preorder (void Preorder (BiTreeBiTree T, T, void( * void( *visit)(TElemTypevisit)(TElemType& e)& e) ) / / 先序遍历二叉树先序遍历二叉树先序遍历二叉树先序遍历二叉树 if (T) if (T) visit(T-data)visit(T-data); / ; / 访问结点访问结点访问结点访问结点 Preorder(Preorder(T-T-lchildlchild, visit, visit) ); / ; / 遍历左子树遍历左子树遍历左子树遍历左

25、子树 Preorder(Preorder(T-T-rchildrchild, visit, visit) );/ ;/ 遍历右子树遍历右子树遍历右子树遍历右子树 算法算法算法算法6.16.1四、中序遍历算法的非递归描述四、中序遍历算法的非递归描述Status Status InOrderTraverse(BiTreeInOrderTraverse(BiTree T,StatusT,Status(*(*visit)(TElemTypevisit)(TElemType e) e)InitStack(SInitStack(S); ); push(S,Tpush(S,T); );while(!Stac

26、kEmpty(Swhile(!StackEmpty(S)while(GetTop(S,p)&pwhile(GetTop(S,p)&p) ) push(S,ppush(S,p-lchildlchild); );pop(S,ppop(S,p); );if(!StackEmpty(Sif(!StackEmpty(S)pop(S,ppop(S,p); ); if(!visit(pif(!visit(p-data) return ERROR;-data) return ERROR;push(S,ppush(S,p-rchildrchild););return OK;return OK; 算法算法算法算法

27、6.26.2算法算法算法算法6.36.3Status Status InOrderTraverse(BiTreeInOrderTraverse(BiTree T,StatusT,Status (* (*visit)(TElemTypevisit)(TElemType e) e) InitStack(SInitStack(S); ); p=T; p=T; while(p|!StackEmpty(Swhile(p|!StackEmpty(S) ) if(pif(p) ) push(S,p);ppush(S,p);p=p-=p-lchildlchild; ;else else pop(S,ppop(

28、S,p); ); if(!visit(pif(!visit(p-data) ) return ERROR;-data) ) return ERROR; return OK;return OK; 五五、遍历算法的应用举例遍历算法的应用举例1、统计二叉树中叶子结点的个数、统计二叉树中叶子结点的个数 (先序遍历先序遍历)2、求二叉树的深度、求二叉树的深度(后序遍历后序遍历)3 3、建立二叉树、建立二叉树1、统计二叉树中叶子结点的个数、统计二叉树中叶子结点的个数算法基本思想算法基本思想: : 先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个需在遍历算法中增

29、添一个“计数计数”的参数,的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增若是叶子,则计数器增1 1。void CountLeaf (BiTree T, int& count) if ( T ) if (!T-lchild)& (!T-rchild) count+; / 对叶子结点计数对叶子结点计数 CountLeaf( T-lchild, count); CountLeaf( T-rchild, count); / if / CountLeaf2、求二叉树的深度、求二叉树的深度(后序遍历后序遍历)算法基本思想算法基本思想: : 从二叉树深度的定义可知,二叉树的二叉树的深度应为其

30、左、右子树深度的最大值加深度应为其左、右子树深度的最大值加1 1。由此,需先分别求得左、右子树的深度,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、求得左、右子树深度的最大值,然后加右子树深度的最大值,然后加 1 1 。 首先分析二叉树的深度二叉树的深度和它的左左、右子右子树深度树深度之间的关系。intint DepthDepth ( (BiTreeBiTree T ) T ) / / 返回二叉树的深度返回二叉树的深度返回二叉树的深度返回二叉树的深度 if ( !T ) if ( !T ) depthvaldepthval = 0; = 0; else else depth

31、LeftdepthLeft = = DepthDepth( T-( T-lchildlchild ) ); ; depthRightdepthRight= = DepthDepth( T-( T-rchildrchild ) ); ; depthvaldepthval = 1 + ( = 1 + (depthLeftdepthLeft depthRightdepthRight ? ? depthLeftdepthLeft : : depthRightdepthRight); ); return return depthvaldepthval; ; 不同的定义方法相应有不同的不同的定义方法相应有

32、不同的存储结构的建立算法存储结构的建立算法3 3、建立二叉树、建立二叉树、建立二叉树、建立二叉树 (1 1) 以字符串的形式以字符串的形式以字符串的形式以字符串的形式 根根根根 左子树左子树左子树左子树 右子树右子树右子树右子树定义一棵二叉树定义一棵二叉树定义一棵二叉树定义一棵二叉树例如:ABCD以空白字符“ ”表示A(B( ,C( , ),D( , )空树空树只含一个根结点只含一个根结点的二叉树的二叉树A以字符串“A ”表示以下列字符串表示Status Status CreateBiTreeCreateBiTree(BiTree(BiTree &T) &T) scanf(&chscanf(&

33、ch); ); if ( if (chch= ) T = NULL;= ) T = NULL; else else if (!(T = ( if (!(T = (BiTNodeBiTNode *) *)malloc(sizeof(BiTNodemalloc(sizeof(BiTNode) exit(OVERFLOW); exit(OVERFLOW); T-data = T-data = chch; / ; / 生成根结点生成根结点生成根结点生成根结点 CreateBiTreeCreateBiTree(T(T-lchildlchild) ); / ; / 构造左子树构造左子树构造左子树构造左子树

34、 CreateBiTreeCreateBiTree(T(T-rchildrchild) ); / ; / 构造右子树构造右子树构造右子树构造右子树 return OK; / return OK; / CreateBiTreeCreateBiTree算法算法算法算法6.46.4A B C D A BCD上页算法执行过程举例如下:上页算法执行过程举例如下:ATBCD(2 2) 按给定的表达式建相应二叉树按给定的表达式建相应二叉树按给定的表达式建相应二叉树按给定的表达式建相应二叉树 由先缀表示式建树由先缀表示式建树例如:已知表达式的先缀表示式 - -+ + a b c / d e 由原表达式建树由原

35、表达式建树例如:已知表达式 (a+b)c d/e d/e对应先缀表达式对应先缀表达式对应先缀表达式对应先缀表达式 - - - - + + + + a b c / d e a b c / d e的二叉树的二叉树的二叉树的二叉树abcde- -+/特点特点: 操作数为叶子叶子结点 运算符为分支分支结点scanf(&ch);if ( In(ch, 字母集 ) 建叶子结点;else 建根结点; 递归建左子树; 递归建右子树;由先缀表示式建树的算法的基本操作:由先缀表示式建树的算法的基本操作:由先缀表示式建树的算法的基本操作:由先缀表示式建树的算法的基本操作:a+b(a+b)c d/e d/ea+bc

36、分析表达式和二叉树的关系分析表达式和二叉树的关系分析表达式和二叉树的关系分析表达式和二叉树的关系: :ab+abc+abc+(a+b)cabcde- -+/基本操作基本操作:scanf(&ch);if (In(ch, 字母集 ) 建叶子结点; 暂存; else if (In(ch, 运算符集) 和前一个运算符比较优先数; 若当前的优先数“高”,则暂存; 否则建子树; void void CrtExptree(BiTreeCrtExptree(BiTree &T, char exp ) &T, char exp ) InitStack(SInitStack(S); Push(S, ); Push

37、(S, # # ); ); InitStack(PTRInitStack(PTR); ); p = exp; p = exp; chch = *p; = *p; while (!( while (!(GetTop(SGetTop(S)=)= # # & & chch= # # ) ) if (! if (!IN(chIN(ch, OP) , OP) CrtNodeCrtNode( t, ( t, chch ); ); / / 建叶子结点并入栈建叶子结点并入栈建叶子结点并入栈建叶子结点并入栈 else else if ( if ( chch!= != # # ) p+; ) p+; chch =

38、 *p; = *p; / while / while Pop(PTR, T); Pop(PTR, T); / / CrtExptreeCrtExptree switch (switch (chch) ) case case ( ( : Push(S, : Push(S, chch); break;); break; case case ) ) : : Pop(S, c);Pop(S, c); while (c!= while (c!= ( ( ) ) CrtSubtreeCrtSubtree( t, c); / ( t, c); / 建二叉树并入栈建二叉树并入栈建二叉树并入栈建二叉树并入栈 P

39、op(S, c) Pop(S, c) break;break; defultdefult : : / switch / switch while(!Gettop(S, c) & ( precede(c,ch) CrtSubtree( t, c); Pop(S, c);if ( ch!= # ) Push( S, ch); break;建叶子结点的算法为:建叶子结点的算法为:void void CrtNode(BiTreeCrtNode(BiTree& T,char & T,char chch) ) T=( T=(BiTNodeBiTNode*)*)malloc(sizeof(BiTNodema

40、lloc(sizeof(BiTNode);); T-data = char; T-data = char; T- T-lchildlchild = T- = T-rchildrchild = NULL; = NULL; Push( PTR, T ); Push( PTR, T ); 建子树的算法为:建子树的算法为:建子树的算法为:建子树的算法为:void void CrtSubtreeCrtSubtree ( (BitreeBitree& T, char c)& T, char c) T=( T=(BiTNodeBiTNode*)*)malloc(sizeof(BiTNodemalloc(si

41、zeof(BiTNode);); T-data = c; T-data = c; Pop(PTR, Pop(PTR, rcrc); T-); T-rchildrchild = = rcrc; ; Pop(PTR, Pop(PTR, lc lc); T-); T-lchildlchild = = lc lc; ; Push(PTR, T);Push(PTR, T); 仅知二叉树的先序序列仅知二叉树的先序序列仅知二叉树的先序序列仅知二叉树的先序序列“ “abcdefgabcdefg” ” 不能唯一不能唯一不能唯一不能唯一确定一棵二叉树,确定一棵二叉树,确定一棵二叉树,确定一棵二叉树,(3 3)由二

42、叉树的先序和中序序列建树)由二叉树的先序和中序序列建树)由二叉树的先序和中序序列建树)由二叉树的先序和中序序列建树 如果同时已知二叉树的中序序列如果同时已知二叉树的中序序列如果同时已知二叉树的中序序列如果同时已知二叉树的中序序列“ “cbdaegfcbdaegf” ”,则会如何?则会如何?则会如何?则会如何? 二叉树的先序序列二叉树的中序序列左子树左子树左子树左子树 右子树右子树右子树右子树根根根根a b c d e f gc b d a e g f例如例如: :aab bccddeeffggabcdefg先序序列中序序列void void CrtBT(BiTreeCrtBT(BiTree&

43、T, char pre, char & T, char pre, char inoino, intint psps, , intint is, is, intint n ) n ) / / 已知已知已知已知preps.ps+n-1preps.ps+n-1为二叉树的先序序列为二叉树的先序序列为二叉树的先序序列为二叉树的先序序列, / / insis.is+n-1insis.is+n-1为二叉树的中序序列,本算为二叉树的中序序列,本算为二叉树的中序序列,本算为二叉树的中序序列,本算 / / 法由此两个序列构造二叉链表法由此两个序列构造二叉链表法由此两个序列构造二叉链表法由此两个序列构造二叉链表 i

44、f (n=0) T=NULL;if (n=0) T=NULL; else else k= k=Search(inoSearch(ino, , prepspreps); / ); / 在中序序列中查询在中序序列中查询在中序序列中查询在中序序列中查询 if (k= -1) T=NULL;if (k= -1) T=NULL; else else / / / / CrtBTCrtBT T T=(=(BiTNodeBiTNode*)*)malloc(sizeof(BiTNodemalloc(sizeof(BiTNode););T-data = T-data = prepspreps; ;if (k=is

45、) T-if (k=is) T-LchildLchild = NULL; = NULL;else else CrtBT(TCrtBT(T-LchildLchild, pre, , pre, inoino, , ps+1, is, k-is ); ps+1, is, k-is );if (k=is+n-1) T-if (k=is+n-1) T-RchildRchild = NULL; = NULL;else else CrtBT(TCrtBT(T-RchildRchild, pre, , pre, inoino, , ps+1+(k-is), k+1, n-(k-is)-1 ); ps+1+(k

46、-is), k+1, n-(k-is)-1 );遍历二叉树的结果是,遍历二叉树的结果是, 求得结点的一个线性序列。求得结点的一个线性序列。ABCDEFGHK例如:先序先序序列: A B C D E F G H K中序中序序列: B D C A H G K F E后序后序序列: D C B H K G F E A6.3.2 6.3.2 线索二叉树线索二叉树线索二叉树线索二叉树指向该线性序列中的指向该线性序列中的指向该线性序列中的指向该线性序列中的“ “前驱前驱前驱前驱” ”和和和和 “ “后继后继后继后继” ” 的指针,称作的指针,称作的指针,称作的指针,称作“ “线索线索线索线索” ”与其相应

47、的二叉树,称与其相应的二叉树,称作作 “线索二叉树线索二叉树”包含包含 “线索线索” 的存储结构,的存储结构,称作称作 “线索链表线索链表”A B C D E F G H K D C B E 对对对对线索链表线索链表线索链表线索链表中结点的约定:中结点的约定:中结点的约定:中结点的约定: 在二叉链表的结点中在二叉链表的结点中在二叉链表的结点中在二叉链表的结点中增加两个标志域增加两个标志域增加两个标志域增加两个标志域,并作如下规定:并作如下规定:并作如下规定:并作如下规定:若该结点的左子树不空,若该结点的左子树不空,若该结点的左子树不空,若该结点的左子树不空,则则则则LchildLchild域的

48、指针指向其左子树,域的指针指向其左子树,域的指针指向其左子树,域的指针指向其左子树, 且左标志域的值为且左标志域的值为且左标志域的值为且左标志域的值为“ “指针指针指针指针 LinkLink” ”; 否则,否则,否则,否则,LchildLchild域的指针指向其域的指针指向其域的指针指向其域的指针指向其“ “前驱前驱前驱前驱” ”, 且左标志的值为且左标志的值为且左标志的值为且左标志的值为“ “线索线索线索线索 ThreadThread” ” 。若该结点的右子树不空,若该结点的右子树不空,若该结点的右子树不空,若该结点的右子树不空,则则则则rchildrchild域的指针指向其右子树,域的指针

49、指向其右子树,域的指针指向其右子树,域的指针指向其右子树, 且右标志域的值为且右标志域的值为且右标志域的值为且右标志域的值为 “ “指针指针指针指针 LinkLink” ”;否则,否则,否则,否则,rchildrchild域的指针指向其域的指针指向其域的指针指向其域的指针指向其“ “后继后继后继后继” ”, 且右标志的值为且右标志的值为且右标志的值为且右标志的值为“ “线索线索线索线索 ThreadThread” ”。 如此定义的二叉树的存储结构称作如此定义的二叉树的存储结构称作如此定义的二叉树的存储结构称作如此定义的二叉树的存储结构称作“ “线索链表线索链表线索链表线索链表” ”。6.4.1

50、 6.4.1 树的三种存储结构树的三种存储结构树的三种存储结构树的三种存储结构一、一、一、一、双亲表示法双亲表示法双亲表示法双亲表示法二、二、二、二、孩子链表表示法孩子链表表示法孩子链表表示法孩子链表表示法三、三、三、三、树的二叉链表树的二叉链表树的二叉链表树的二叉链表( ( ( (孩子孩子孩子孩子- - - -兄弟)兄弟)兄弟)兄弟) 存储表示法存储表示法存储表示法存储表示法6.4 6.4 树和森林树和森林树和森林树和森林ABCDEFG0 A -11 B 02 C 03 D 04 E 2 5 F 26 G 5r=0n=6data parent一、双亲表示法一、双亲表示法: typedef s

51、truct PTNode Elem data; int parent; / 双亲位置域 PTNode; data parent#define MAX_TREE_SIZE 100结点结构结点结构:C语言的类型描述语言的类型描述: :typedef struct PTNode nodes MAX_TREE_SIZE; int r, n; / 根结点的位置和结点个数 PTree;树结构树结构:ABCDEFG0 A -11 B 02 C 03 D 04 E 25 F 26 G 5r=0n=6 data firstchild 1 2 34 56二、孩子链表表示法二、孩子链表表示法:-1000224typ

52、edef struct CTNode int child; struct CTNode *next; *ChildPtr;孩子结点结构孩子结点结构: child nextC语言的类型描述语言的类型描述: : typedef struct Elem data; ChildPtr firstchild; / 孩子链的头指针 CTBox;双亲结点结构双亲结点结构 data firstchildtypedef struct CTBox nodesMAX_TREE_SIZE; int n, r; / 结点数和根结点的位置 CTree;树结构树结构:ABCDEFG AB C E D F Groot AB

53、C E D F G 三、树的二叉链表三、树的二叉链表三、树的二叉链表三、树的二叉链表 ( (孩子孩子孩子孩子- -兄弟)存储表示法兄弟)存储表示法兄弟)存储表示法兄弟)存储表示法typedef struct CSNode Elem data; struct CSNode *firstchild, *nextsibling; CSNode, *CSTree;C语言的类型描述语言的类型描述: :结点结构结点结构: firstchild data nextsibling 6.4.2 森林和二叉树的对应关系森林和二叉树的对应关系设设森林森林 F = ( T1, T2, , Tn ); T1 = (ro

54、ot,t11, t12, , t1m);二叉树二叉树 B =( LBT, Node(root), RBT );由森林转换成二叉树由森林转换成二叉树的转换规则为:若 F = ,则 B = ;否则, 由 ROOT( T1 ) 对应得到 Node(root); 由 (t11, t12, , t1m ) 对应得到 LBT; 由 (T2, T3, Tn ) 对应得到 RBT。由二叉树转换为森林由二叉树转换为森林的转换规则为:若 B = , 则 F = ;否则,由 Node(root) 对应得到 ROOT( T1 );由LBT 对应得到 ( t11, t12, ,t1m);由RBT 对应得到 (T2, T

55、3, , Tn)。 由此,树的各种操作均可对应二叉树的操作来完成。 应当注意的是,应当注意的是,和树对应的二叉树,其左、右子树的概念已改变为: 左是孩子,右是兄弟。左是孩子,右是兄弟。6.4.3 6.4.3 树和森林的遍历树和森林的遍历树和森林的遍历树和森林的遍历树的遍历可有三条搜索路径树的遍历可有三条搜索路径树的遍历可有三条搜索路径树的遍历可有三条搜索路径: :按层次遍历按层次遍历按层次遍历按层次遍历: :先根先根先根先根( (次序次序次序次序) )遍历遍历遍历遍历: :后根后根后根后根( (次序次序次序次序) )遍历遍历遍历遍历: : 若树不空,则先访问根结点,然后依次先根遍若树不空,则先

56、访问根结点,然后依次先根遍若树不空,则先访问根结点,然后依次先根遍若树不空,则先访问根结点,然后依次先根遍历各棵子树。历各棵子树。历各棵子树。历各棵子树。 若树不空,则先依次后根遍历各棵子树,然后若树不空,则先依次后根遍历各棵子树,然后若树不空,则先依次后根遍历各棵子树,然后若树不空,则先依次后根遍历各棵子树,然后访问根结点。访问根结点。访问根结点。访问根结点。 若树不空,则自上而下自左至右访问树中每若树不空,则自上而下自左至右访问树中每若树不空,则自上而下自左至右访问树中每若树不空,则自上而下自左至右访问树中每个结点。个结点。个结点。个结点。 A B C DE F G H I J K 先根遍

57、历时顶点先根遍历时顶点的访问次序:的访问次序:A B E F C D G H I J K 后根遍历时顶点后根遍历时顶点的访问次序:的访问次序:E F B C I J K H G D A 层次遍历时顶点层次遍历时顶点的访问次序:的访问次序:A B C D E F G H I J K B C DE F G H I J K1森林中第一棵树的根结点;2森林中第一棵树的子树森林;3森林中其它树构成的森林。森林由三部分构成:1. 先序遍历先序遍历森林的遍历森林的遍历 若森林不空,则访问访问森林中第一棵树的根结点;先序遍历先序遍历森林中第一棵树的子树森林;先序遍历先序遍历森林中(除第一棵树之外)其 余树构成

58、的森林。即:依次从左至右依次从左至右对森林中的每一棵树树进行先根遍历先根遍历。中序遍历中序遍历 若森林不空,则中序遍历中序遍历森林中第一棵树的子树森林;访问访问森林中第一棵树的根结点;中序遍历中序遍历森林中(除第一棵树之外)其 余树构成的森林。即:依次从左至右依次从左至右对森林中的每一棵树树进行后根遍历后根遍历。 最优树的定义最优树的定义 如何构造最优树如何构造最优树 前缀编码前缀编码 6.6 6.6 哈夫曼树及其应用哈夫曼树及其应用哈夫曼树及其应用哈夫曼树及其应用 一、最优树的定义一、最优树的定义树的路径长度树的路径长度定义为: 树中每个结点的路径长度之和。 结点的路径长度结点的路径长度定义

59、为: 从根结点到该结点的路径上 分支的数目。 树的带权路径长度树的带权路径长度定义为: 树中所有叶子结点的带权路径长度结点的带权路径长度之和 WPL(T) = wklk (对所有叶子结点)。 在所有含 n 个叶子结点、并带相同权值的 m 叉树中,必存在一棵其带权路径带权路径长度取最小值长度取最小值的树,称为“最优树最优树”。例如:例如:27 9 75492WPL(T)= 72+52+23+43+92 =60WPL(T)= 74+94+53+42+21 =89 54 根据给定的 n 个权值 w1, w2, , wn, 构造 n 棵二叉树的集合 F = T1, T2, , Tn, 其中每棵二叉树中

60、均只含一个带权值 为 wi 的根结点,其左、右子树为空树;二、如何构造最优树二、如何构造最优树(1)(赫夫曼算法) 以二叉树为例: 在 F 中选取其根结点的权值为最 小的两棵二叉树,分别作为左、 右子树构造一棵新的二叉树,并 置这棵新的二叉树根结点的权值 为其左、右子树根结点的权值之 和;(2) 从F中删去这两棵树,同时加入 刚生成的新树; 重复 (2) 和 (3) 两步,直至 F 中只 含一棵树为止。(3)(4)9例如: 已知权值 W= 5, 6, 2, 9, 7 5627527697671395276713952795271667132900001111000110110111 指的是,任

61、何一个字符的编码都任何一个字符的编码都不是同一字符集中另一个字符的编码不是同一字符集中另一个字符的编码的前缀的前缀。三、前缀编码三、前缀编码 利用赫夫曼树可以构造一种不等长利用赫夫曼树可以构造一种不等长的二进制编码,并且构造所得的的二进制编码,并且构造所得的赫夫赫夫曼编码曼编码是一种是一种最优前缀编码最优前缀编码,即使所,即使所传传电文的总长度最短电文的总长度最短。1. 1. 熟练掌握二叉树的结构特性,了解相应的证明熟练掌握二叉树的结构特性,了解相应的证明熟练掌握二叉树的结构特性,了解相应的证明熟练掌握二叉树的结构特性,了解相应的证明方法。方法。方法。方法。2. 2. 熟悉二叉树的各种存储结构

62、的特点及适用范围。熟悉二叉树的各种存储结构的特点及适用范围。熟悉二叉树的各种存储结构的特点及适用范围。熟悉二叉树的各种存储结构的特点及适用范围。3. 3. 遍历二叉树是二叉树各种操作的基础。实现二遍历二叉树是二叉树各种操作的基础。实现二遍历二叉树是二叉树各种操作的基础。实现二遍历二叉树是二叉树各种操作的基础。实现二叉树遍历的具体算法与所采用的存储结构有关。掌叉树遍历的具体算法与所采用的存储结构有关。掌叉树遍历的具体算法与所采用的存储结构有关。掌叉树遍历的具体算法与所采用的存储结构有关。掌握各种遍历策略的递归算法,灵活运用遍历算法实握各种遍历策略的递归算法,灵活运用遍历算法实握各种遍历策略的递归

63、算法,灵活运用遍历算法实握各种遍历策略的递归算法,灵活运用遍历算法实现二叉树的其它操作。层次遍历是按另一种搜索策现二叉树的其它操作。层次遍历是按另一种搜索策现二叉树的其它操作。层次遍历是按另一种搜索策现二叉树的其它操作。层次遍历是按另一种搜索策略进行的遍历。略进行的遍历。略进行的遍历。略进行的遍历。4. 4. 理解二叉树线索化的实质是建立结点与其在理解二叉树线索化的实质是建立结点与其在理解二叉树线索化的实质是建立结点与其在理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系,熟练掌相应序列中的前驱或后继之间的直接联系,熟练掌相应序列中的前驱或后继之间的直接联系,熟练掌相应

64、序列中的前驱或后继之间的直接联系,熟练掌握二叉树的线索化过程以及在中序线索化树上找给握二叉树的线索化过程以及在中序线索化树上找给握二叉树的线索化过程以及在中序线索化树上找给握二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。二叉树的线索化过程定结点的前驱和后继的方法。二叉树的线索化过程定结点的前驱和后继的方法。二叉树的线索化过程定结点的前驱和后继的方法。二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索是基于对二叉树进行遍历,而线索二叉树上的线索是基于对二叉树进行遍历,而线索二叉树上的线索是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便。又为相

65、应的遍历提供了方便。又为相应的遍历提供了方便。又为相应的遍历提供了方便。5. 5. 熟悉树的各种存储结构及其特点,掌握树和森熟悉树的各种存储结构及其特点,掌握树和森熟悉树的各种存储结构及其特点,掌握树和森熟悉树的各种存储结构及其特点,掌握树和森林与二叉树的转换方法。建立存储结构是进行其它操林与二叉树的转换方法。建立存储结构是进行其它操林与二叉树的转换方法。建立存储结构是进行其它操林与二叉树的转换方法。建立存储结构是进行其它操作的前提,因此读者应掌握作的前提,因此读者应掌握作的前提,因此读者应掌握作的前提,因此读者应掌握 1 1 至至至至 2 2 种建立二叉树和树种建立二叉树和树种建立二叉树和树

66、种建立二叉树和树的存储结构的方法。的存储结构的方法。的存储结构的方法。的存储结构的方法。6. 6. 学会编写实现树的各种操作的算法。学会编写实现树的各种操作的算法。学会编写实现树的各种操作的算法。学会编写实现树的各种操作的算法。7. 7. 了解最优树的特性,掌握建立最优树和哈夫曼了解最优树的特性,掌握建立最优树和哈夫曼了解最优树的特性,掌握建立最优树和哈夫曼了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。编码的方法。编码的方法。编码的方法。作业作业作业作业一、选择题一、选择题一、选择题一、选择题1 1、树最适合用来表示、树最适合用来表示、树最适合用来表示、树最适合用来表示_A A)有序数据

67、元素)有序数据元素)有序数据元素)有序数据元素B B)无序数据元素)无序数据元素)无序数据元素)无序数据元素C C)元素之间具有分支层次关系的数据)元素之间具有分支层次关系的数据)元素之间具有分支层次关系的数据)元素之间具有分支层次关系的数据D D)元素之间无联系的数据)元素之间无联系的数据)元素之间无联系的数据)元素之间无联系的数据2 2、将一棵有、将一棵有、将一棵有、将一棵有100100个结点的完全二叉树从根这一层开始,每一层从左到右个结点的完全二叉树从根这一层开始,每一层从左到右个结点的完全二叉树从根这一层开始,每一层从左到右个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行

68、编号,根结点的编号为依次对结点进行编号,根结点的编号为依次对结点进行编号,根结点的编号为依次对结点进行编号,根结点的编号为1 1,则编号为,则编号为,则编号为,则编号为4949的结点的左孩子的结点的左孩子的结点的左孩子的结点的左孩子编号为编号为编号为编号为_。A A)98 B98 B)99 C99 C)50 D50 D)48483 3、在下图所示的、在下图所示的、在下图所示的、在下图所示的4 4棵二叉树中,棵二叉树中,棵二叉树中,棵二叉树中,_不是完全二叉树。不是完全二叉树。不是完全二叉树。不是完全二叉树。A A)图()图()图()图(a a) B B)图()图()图()图(b b) C C)

69、图()图()图()图(c c) D D)图()图()图()图(d d)(a)(b)(c)(d)4 4、在一棵二叉树中,双分支的结点数为、在一棵二叉树中,双分支的结点数为、在一棵二叉树中,双分支的结点数为、在一棵二叉树中,双分支的结点数为1515,单分支结点数为,单分支结点数为,单分支结点数为,单分支结点数为3030,则叶子结点数为则叶子结点数为则叶子结点数为则叶子结点数为_。A A)15 B15 B)16 C16 C)17 D17 D)47475 5、判断线索二叉树中某结点、判断线索二叉树中某结点、判断线索二叉树中某结点、判断线索二叉树中某结点* *p p有左孩子的条件是有左孩子的条件是有左孩

70、子的条件是有左孩子的条件是_。A A)p-p-lchildlchild=NULL B=NULL B)p-p-lchildlchild=NULL=NULLC C)p-p-ltagltag=0 D=0 D)p-p-ltagltag=1=16 6、如果、如果、如果、如果T1T1是由有序树是由有序树是由有序树是由有序树T T转换而来的二叉树,那么转换而来的二叉树,那么转换而来的二叉树,那么转换而来的二叉树,那么T T中结点的前序遍历序列中结点的前序遍历序列中结点的前序遍历序列中结点的前序遍历序列就是就是就是就是T1T1中结点的中结点的中结点的中结点的_遍历序列。遍历序列。遍历序列。遍历序列。A A)前

71、序)前序)前序)前序 B B)中序)中序)中序)中序 C C)后序)后序)后序)后序 D D)层次序)层次序)层次序)层次序abdecfhg7 7、一棵二叉树如下图所示,其中序遍历的序列为、一棵二叉树如下图所示,其中序遍历的序列为、一棵二叉树如下图所示,其中序遍历的序列为、一棵二叉树如下图所示,其中序遍历的序列为_。A A)abdgcefhabdgcefh B B)dgbaechfdgbaechfC C)gdbehfcagdbehfca D D)abcdefghabcdefgh8 8、深度为、深度为、深度为、深度为5 5的二叉树至多有的二叉树至多有的二叉树至多有的二叉树至多有_个结点。个结点。

72、个结点。个结点。A A)16 B16 B)32 C32 C)31 D31 D)10109 9、在一非空二叉树的中序遍历序列中,根结点的右边、在一非空二叉树的中序遍历序列中,根结点的右边、在一非空二叉树的中序遍历序列中,根结点的右边、在一非空二叉树的中序遍历序列中,根结点的右边_。A A)只有右子树上的所有结点)只有右子树上的所有结点)只有右子树上的所有结点)只有右子树上的所有结点 B B)只有右子树上的部分结点)只有右子树上的部分结点)只有右子树上的部分结点)只有右子树上的部分结点C C)只有左子树上的部分结点)只有左子树上的部分结点)只有左子树上的部分结点)只有左子树上的部分结点 D D)只

73、有左子树上的所有结点)只有左子树上的所有结点)只有左子树上的所有结点)只有左子树上的所有结点1010、如下图所示的、如下图所示的、如下图所示的、如下图所示的T2T2是由森林是由森林是由森林是由森林T1T1转换而来的二叉树,那么森林转换而来的二叉树,那么森林转换而来的二叉树,那么森林转换而来的二叉树,那么森林T1T1有有有有_个叶结点。个叶结点。个叶结点。个叶结点。A A)4 4 B B)5 5 C C)6 6 D D)7 71111、设、设、设、设n n、mm为一棵二叉树上的两个结点,在中序遍历时,为一棵二叉树上的两个结点,在中序遍历时,为一棵二叉树上的两个结点,在中序遍历时,为一棵二叉树上的

74、两个结点,在中序遍历时,n n在在在在mm前的条件是前的条件是前的条件是前的条件是_。A A)n n在在在在mm右方右方右方右方 B B)n n是是是是mm祖先祖先祖先祖先 C C)n n在在在在mm左方左方左方左方 D D)n n是是是是mm子孙子孙子孙子孙1212、有、有、有、有n n个叶子结点的哈夫曼树的结点总数为个叶子结点的哈夫曼树的结点总数为个叶子结点的哈夫曼树的结点总数为个叶子结点的哈夫曼树的结点总数为_。A A)不确定)不确定)不确定)不确定 B B)2n C2n C)2n2n1 D1 D)2n2n1 11313、设树、设树、设树、设树T T的度为的度为的度为的度为4 4,其中度

75、为,其中度为,其中度为,其中度为1 1、2 2、3 3、4 4的结点个数分别为的结点个数分别为的结点个数分别为的结点个数分别为4 4、2 2、1 1、1 1,则则则则T T中的叶子数为中的叶子数为中的叶子数为中的叶子数为_。A A)5 B5 B)6 C6 C)7 D7 D)8 81414、有、有、有、有n n个叶子的哈夫曼树的结点总数为个叶子的哈夫曼树的结点总数为个叶子的哈夫曼树的结点总数为个叶子的哈夫曼树的结点总数为_A A)不确定)不确定)不确定)不确定 B B)2n C2n C)2n2n1 D1 D)2n2n1 11515、树的先序遍历是、树的先序遍历是、树的先序遍历是、树的先序遍历是_

76、A A)先访问树的根结点,再从左到右依次先序遍历根结点的各子树)先访问树的根结点,再从左到右依次先序遍历根结点的各子树)先访问树的根结点,再从左到右依次先序遍历根结点的各子树)先访问树的根结点,再从左到右依次先序遍历根结点的各子树B B)先序遍历根结点的各子树,最后访问根结点)先序遍历根结点的各子树,最后访问根结点)先序遍历根结点的各子树,最后访问根结点)先序遍历根结点的各子树,最后访问根结点C C)先从左到右依次先序遍历根结点的各子树)先从左到右依次先序遍历根结点的各子树)先从左到右依次先序遍历根结点的各子树)先从左到右依次先序遍历根结点的各子树D D)先访问树的根结点,再从右到左依次先序遍

77、历根结点的各子树)先访问树的根结点,再从右到左依次先序遍历根结点的各子树)先访问树的根结点,再从右到左依次先序遍历根结点的各子树)先访问树的根结点,再从右到左依次先序遍历根结点的各子树1616、除根结点外,树上每个结点、除根结点外,树上每个结点、除根结点外,树上每个结点、除根结点外,树上每个结点_A A)可有任意多个孩子,任意多个双亲)可有任意多个孩子,任意多个双亲)可有任意多个孩子,任意多个双亲)可有任意多个孩子,任意多个双亲 B B)可有任意多个孩子、一个双亲)可有任意多个孩子、一个双亲)可有任意多个孩子、一个双亲)可有任意多个孩子、一个双亲C C)可有一个孩子、任意多个双亲)可有一个孩子

78、、任意多个双亲)可有一个孩子、任意多个双亲)可有一个孩子、任意多个双亲 D D)只有一个孩子、一个双亲)只有一个孩子、一个双亲)只有一个孩子、一个双亲)只有一个孩子、一个双亲1818、现有一棵结点总数为、现有一棵结点总数为、现有一棵结点总数为、现有一棵结点总数为2020的二叉树,它含有的二叉树,它含有的二叉树,它含有的二叉树,它含有4 4个度为个度为个度为个度为2 2的结点,的结点,的结点,的结点,由此可知其叶子结点数为由此可知其叶子结点数为由此可知其叶子结点数为由此可知其叶子结点数为_A A)20 B20 B)16 C16 C)11 D11 D)5 51919、若由一棵一般树转化得到的二叉树

79、是非空二叉树,、若由一棵一般树转化得到的二叉树是非空二叉树,、若由一棵一般树转化得到的二叉树是非空二叉树,、若由一棵一般树转化得到的二叉树是非空二叉树,则该二叉树的形状是则该二叉树的形状是则该二叉树的形状是则该二叉树的形状是_A A)根结点无右子树的二叉树)根结点无右子树的二叉树)根结点无右子树的二叉树)根结点无右子树的二叉树 B B)根结点无左子树的二叉树)根结点无左子树的二叉树)根结点无左子树的二叉树)根结点无左子树的二叉树C C)根结点可能有左子树和右子树)根结点可能有左子树和右子树)根结点可能有左子树和右子树)根结点可能有左子树和右子树 D D)各结点只有一个孩子的二叉树)各结点只有一

80、个孩子的二叉树)各结点只有一个孩子的二叉树)各结点只有一个孩子的二叉树 2020、若由森林转化得到的二叉树是非空二叉树,、若由森林转化得到的二叉树是非空二叉树,、若由森林转化得到的二叉树是非空二叉树,、若由森林转化得到的二叉树是非空二叉树,则该二叉树的形状是则该二叉树的形状是则该二叉树的形状是则该二叉树的形状是_A A)根结点无右子树的二叉树)根结点无右子树的二叉树)根结点无右子树的二叉树)根结点无右子树的二叉树 B B)根结点无左子树的二叉树)根结点无左子树的二叉树)根结点无左子树的二叉树)根结点无左子树的二叉树C C)根结点可能有左子树和右子树)根结点可能有左子树和右子树)根结点可能有左子

81、树和右子树)根结点可能有左子树和右子树 D D)各结点只有一个孩子的二叉树)各结点只有一个孩子的二叉树)各结点只有一个孩子的二叉树)各结点只有一个孩子的二叉树2121、哈夫曼树是访问叶子结点的外部路径长度、哈夫曼树是访问叶子结点的外部路径长度、哈夫曼树是访问叶子结点的外部路径长度、哈夫曼树是访问叶子结点的外部路径长度_的二叉树。的二叉树。的二叉树。的二叉树。A A)最短)最短)最短)最短 B B)最长)最长)最长)最长 C C)可变)可变)可变)可变 D D)固定)固定)固定)固定2222、从、从、从、从1 1开始对二叉树进行连续编号,要求每个结点的编号大于其左、开始对二叉树进行连续编号,要求

82、每个结点的编号大于其左、开始对二叉树进行连续编号,要求每个结点的编号大于其左、开始对二叉树进行连续编号,要求每个结点的编号大于其左、右孩子的编号。在同一个结点的左、右孩子中,其左孩子的编号小于右孩子的编号。在同一个结点的左、右孩子中,其左孩子的编号小于右孩子的编号。在同一个结点的左、右孩子中,其左孩子的编号小于右孩子的编号。在同一个结点的左、右孩子中,其左孩子的编号小于其右孩子的编号,则可采用其右孩子的编号,则可采用其右孩子的编号,则可采用其右孩子的编号,则可采用_遍历实现编号。遍历实现编号。遍历实现编号。遍历实现编号。A A)先序)先序)先序)先序 B B)中序)中序)中序)中序 C C)后

83、序)后序)后序)后序 D D)从根开始的层次遍历)从根开始的层次遍历)从根开始的层次遍历)从根开始的层次遍历2323、二叉树在线索化后,下列问题中相对较难解决的是、二叉树在线索化后,下列问题中相对较难解决的是、二叉树在线索化后,下列问题中相对较难解决的是、二叉树在线索化后,下列问题中相对较难解决的是_A A)先序线索二叉树中求先序后继)先序线索二叉树中求先序后继)先序线索二叉树中求先序后继)先序线索二叉树中求先序后继 B B)中序线索二叉树中求中序后继)中序线索二叉树中求中序后继)中序线索二叉树中求中序后继)中序线索二叉树中求中序后继C C)中序线索二叉树中求中序前趋)中序线索二叉树中求中序前

84、趋)中序线索二叉树中求中序前趋)中序线索二叉树中求中序前趋 D D)后序线索二叉树中求后序后继)后序线索二叉树中求后序后继)后序线索二叉树中求后序后继)后序线索二叉树中求后序后继2424、一棵左子树为空的二叉树在先序线索化后,其空指针域数为、一棵左子树为空的二叉树在先序线索化后,其空指针域数为、一棵左子树为空的二叉树在先序线索化后,其空指针域数为、一棵左子树为空的二叉树在先序线索化后,其空指针域数为_A A)0 B0 B)1 C1 C)2 D2 D)不确定)不确定)不确定)不确定2525、对具有、对具有、对具有、对具有100100个结点的二叉树,若用二叉链表存储,则其指针域部分用个结点的二叉树

85、,若用二叉链表存储,则其指针域部分用个结点的二叉树,若用二叉链表存储,则其指针域部分用个结点的二叉树,若用二叉链表存储,则其指针域部分用来指向结点的左、右孩子,其余来指向结点的左、右孩子,其余来指向结点的左、右孩子,其余来指向结点的左、右孩子,其余_个指针域为空。个指针域为空。个指针域为空。个指针域为空。A A)50 B50 B)99 C99 C)100 D100 D)1011012626、设有、设有、设有、设有1313个值,用它们组成一棵哈夫曼树,则该哈夫曼树中共有个值,用它们组成一棵哈夫曼树,则该哈夫曼树中共有个值,用它们组成一棵哈夫曼树,则该哈夫曼树中共有个值,用它们组成一棵哈夫曼树,则

86、该哈夫曼树中共有_个结点。个结点。个结点。个结点。A A)13 B13 B)12 C12 C)26 D26 D)2525二、填空题二、填空题二、填空题二、填空题1 1、若已知一棵二叉树的先序序列和中序序列分别是、若已知一棵二叉树的先序序列和中序序列分别是、若已知一棵二叉树的先序序列和中序序列分别是、若已知一棵二叉树的先序序列和中序序列分别是BEFCGDHBEFCGDH和和和和FEBGCHDFEBGCHD,则它的后序序列是,则它的后序序列是,则它的后序序列是,则它的后序序列是_,层次遍历序列是层次遍历序列是层次遍历序列是层次遍历序列是_ _ 2 2、二叉树的先序遍历顺序是、二叉树的先序遍历顺序是

87、、二叉树的先序遍历顺序是、二叉树的先序遍历顺序是ABDGEHICEABDGEHICE,则该二叉树的根结点是,则该二叉树的根结点是,则该二叉树的根结点是,则该二叉树的根结点是_3 3、二叉树的后序遍历顺序是、二叉树的后序遍历顺序是、二叉树的后序遍历顺序是、二叉树的后序遍历顺序是GFCDBFIBAGFCDBFIBA,则该二叉树的根结点是,则该二叉树的根结点是,则该二叉树的根结点是,则该二叉树的根结点是_4 4、树与二叉树之间的转换方法中,树的根结点变成二叉树的、树与二叉树之间的转换方法中,树的根结点变成二叉树的、树与二叉树之间的转换方法中,树的根结点变成二叉树的、树与二叉树之间的转换方法中,树的根

88、结点变成二叉树的_5 5、树与二叉树之间的转换方法中,树的、树与二叉树之间的转换方法中,树的、树与二叉树之间的转换方法中,树的、树与二叉树之间的转换方法中,树的B B结点的右边相邻的兄弟结点是结点的右边相邻的兄弟结点是结点的右边相邻的兄弟结点是结点的右边相邻的兄弟结点是C C,在变成二叉树后,在变成二叉树后,在变成二叉树后,在变成二叉树后,C C结点是结点是结点是结点是B B结点的结点的结点的结点的_结点。结点。结点。结点。6 6、已知一棵二叉树的中序遍历序列为、已知一棵二叉树的中序遍历序列为、已知一棵二叉树的中序遍历序列为、已知一棵二叉树的中序遍历序列为DBEHAFCIGDBEHAFCIG,

89、后序遍历序列为,后序遍历序列为,后序遍历序列为,后序遍历序列为DHEBFIGCADHEBFIGCA,该二叉树的前序序列为,该二叉树的前序序列为,该二叉树的前序序列为,该二叉树的前序序列为_,层次遍历序,层次遍历序,层次遍历序,层次遍历序列是列是列是列是_。三、简答题三、简答题三、简答题三、简答题1 1、下述编码哪一组不是前缀码?、下述编码哪一组不是前缀码?、下述编码哪一组不是前缀码?、下述编码哪一组不是前缀码?0000,0101,1010,1111,00,1 1,0000,1111,00,1010,110110,111111四、综合题四、综合题四、综合题四、综合题1 1、采用顺序存储方法和链接

90、存储方法分别画出下图所示的、采用顺序存储方法和链接存储方法分别画出下图所示的、采用顺序存储方法和链接存储方法分别画出下图所示的、采用顺序存储方法和链接存储方法分别画出下图所示的二叉树的存储结构。并写出该树的前序、中序和后序序列。二叉树的存储结构。并写出该树的前序、中序和后序序列。二叉树的存储结构。并写出该树的前序、中序和后序序列。二叉树的存储结构。并写出该树的前序、中序和后序序列。425316782 2、若二叉树中各结点的值均不相同,则由二叉树的前序序列和、若二叉树中各结点的值均不相同,则由二叉树的前序序列和、若二叉树中各结点的值均不相同,则由二叉树的前序序列和、若二叉树中各结点的值均不相同,

91、则由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。(1 1)已知一棵二叉树的前序序列和中序序列分别为)已知一棵二叉树的前序序列和中序序列分别为)已知一棵二叉树的前序序列和中

92、序序列分别为)已知一棵二叉树的前序序列和中序序列分别为 ABDGHCEFIABDGHCEFI和和和和GDHBAECIFGDHBAECIF,请画出此二叉树。,请画出此二叉树。,请画出此二叉树。,请画出此二叉树。(2 2)已知一棵二叉树的中序序列和后序序列分别为)已知一棵二叉树的中序序列和后序序列分别为)已知一棵二叉树的中序序列和后序序列分别为)已知一棵二叉树的中序序列和后序序列分别为 BDCEAFHGBDCEAFHG和和和和DECBHGFADECBHGFA,请画出该二叉树。,请画出该二叉树。,请画出该二叉树。,请画出该二叉树。(3 3)已知两棵二叉树的前序序列和后序序列均为)已知两棵二叉树的前序

93、序列和后序序列均为)已知两棵二叉树的前序序列和后序序列均为)已知两棵二叉树的前序序列和后序序列均为ABAB和和和和BABA,请画出这两棵不同的二叉树。请画出这两棵不同的二叉树。请画出这两棵不同的二叉树。请画出这两棵不同的二叉树。CABCABD(a)(b)3 3、试画出如下图中两棵二叉树的先根次序、中根次序、后根次序的线索树。、试画出如下图中两棵二叉树的先根次序、中根次序、后根次序的线索树。、试画出如下图中两棵二叉树的先根次序、中根次序、后根次序的线索树。、试画出如下图中两棵二叉树的先根次序、中根次序、后根次序的线索树。4 4、对如下图所示的森林:、对如下图所示的森林:、对如下图所示的森林:、对

94、如下图所示的森林:(1 1)求各树的前序序列和后序序列;)求各树的前序序列和后序序列;)求各树的前序序列和后序序列;)求各树的前序序列和后序序列;(2 2)求森林的前序序列和后序序列;)求森林的前序序列和后序序列;)求森林的前序序列和后序序列;)求森林的前序序列和后序序列;(3 3)将此森林转换为相应的二叉树;)将此森林转换为相应的二叉树;)将此森林转换为相应的二叉树;)将此森林转换为相应的二叉树;(4 4)给出()给出()给出()给出(a a)所示树的双亲链表表示、孩子链表表示、带双亲的孩子)所示树的双亲链表表示、孩子链表表示、带双亲的孩子)所示树的双亲链表表示、孩子链表表示、带双亲的孩子)

95、所示树的双亲链表表示、孩子链表表示、带双亲的孩子链表表示及孩子兄弟链表表示等四种存储结构,并指出哪些存储结构易链表表示及孩子兄弟链表表示等四种存储结构,并指出哪些存储结构易链表表示及孩子兄弟链表表示等四种存储结构,并指出哪些存储结构易链表表示及孩子兄弟链表表示等四种存储结构,并指出哪些存储结构易于求指定结点的祖先,哪些易于求指定结点的后代?于求指定结点的祖先,哪些易于求指定结点的后代?于求指定结点的祖先,哪些易于求指定结点的后代?于求指定结点的祖先,哪些易于求指定结点的后代?F FC CD DE EB BA AK KH HI IJ JGGOOL LMMN NQQP PR R(a a)(b b)

96、(c c)5 5、画出如下图所示的二叉树所对应的森林。、画出如下图所示的二叉树所对应的森林。、画出如下图所示的二叉树所对应的森林。、画出如下图所示的二叉树所对应的森林。A AB BC CD DGGH HJ JK KF FI IL LE E6 6、假设用于通信的电文由字符集、假设用于通信的电文由字符集、假设用于通信的电文由字符集、假设用于通信的电文由字符集aa,b b,c c,d d,e e,f f,g g,hh中的字母中的字母中的字母中的字母构成,这构成,这构成,这构成,这8 8个字母在电文中出现的概率分别为个字母在电文中出现的概率分别为个字母在电文中出现的概率分别为个字母在电文中出现的概率分

97、别为0.070.07,0.190.19,0.020.02,0.060.06,0.320.32,0.030.03,0.210.21,0.100.10。(1 1)为这)为这)为这)为这8 8个字母设计哈夫曼编码。个字母设计哈夫曼编码。个字母设计哈夫曼编码。个字母设计哈夫曼编码。(2 2)若用三位二进制数()若用三位二进制数()若用三位二进制数()若用三位二进制数(0 07 7)对这个)对这个)对这个)对这个8 8个字母进行等长编码,个字母进行等长编码,个字母进行等长编码,个字母进行等长编码,则哈夫曼编码的平均码长是等长编码的百分之几?它使电文总则哈夫曼编码的平均码长是等长编码的百分之几?它使电文总

98、则哈夫曼编码的平均码长是等长编码的百分之几?它使电文总则哈夫曼编码的平均码长是等长编码的百分之几?它使电文总长平均压缩多少?长平均压缩多少?长平均压缩多少?长平均压缩多少?7 7、设一棵二叉树的中序遍历序列为、设一棵二叉树的中序遍历序列为、设一棵二叉树的中序遍历序列为、设一棵二叉树的中序遍历序列为DGBAECHIFDGBAECHIF、后序遍历序列、后序遍历序列、后序遍历序列、后序遍历序列 为为为为GDBEIHFCAGDBEIHFCA(1 1)画出这棵二叉树。)画出这棵二叉树。)画出这棵二叉树。)画出这棵二叉树。(2 2)画出该二叉树的中序线索二叉树。)画出该二叉树的中序线索二叉树。)画出该二叉

99、树的中序线索二叉树。)画出该二叉树的中序线索二叉树。(3 3)画出该二叉树对应的森林。)画出该二叉树对应的森林。)画出该二叉树对应的森林。)画出该二叉树对应的森林。9 9、对二叉树中的结点进行按层次顺序(每一层自左至右)访问的操作称、对二叉树中的结点进行按层次顺序(每一层自左至右)访问的操作称、对二叉树中的结点进行按层次顺序(每一层自左至右)访问的操作称、对二叉树中的结点进行按层次顺序(每一层自左至右)访问的操作称为二叉树的层次遍历,得到的结点序列称为二叉树的层次序列。为二叉树的层次遍历,得到的结点序列称为二叉树的层次序列。为二叉树的层次遍历,得到的结点序列称为二叉树的层次序列。为二叉树的层次

100、遍历,得到的结点序列称为二叉树的层次序列。现已知一棵二叉树的层次序列为现已知一棵二叉树的层次序列为现已知一棵二叉树的层次序列为现已知一棵二叉树的层次序列为ABCDEFGHIJABCDEFGHIJ,中序序列为,中序序列为,中序序列为,中序序列为DBGEHJACIFDBGEHJACIF,请画出该二叉树。,请画出该二叉树。,请画出该二叉树。,请画出该二叉树。 8 8、设一棵二叉树的先序遍历序列为、设一棵二叉树的先序遍历序列为、设一棵二叉树的先序遍历序列为、设一棵二叉树的先序遍历序列为ABDFCEGHABDFCEGH,中序遍历序列,中序遍历序列,中序遍历序列,中序遍历序列为为为为BFDAGEHCBFDAGEHC。(1 1)画出这棵二叉树。)画出这棵二叉树。)画出这棵二叉树。)画出这棵二叉树。(2 2)画出该二叉树的后序线索二叉树。)画出该二叉树的后序线索二叉树。)画出该二叉树的后序线索二叉树。)画出该二叉树的后序线索二叉树。(3 3)画出该二叉树对应的森林。)画出该二叉树对应的森林。)画出该二叉树对应的森林。)画出该二叉树对应的森林。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号